鸿蒙【Harmony】@Builder 自定义构建函数
若自定义的组件内部UI结构固定,且仅与使用方进行数据传递。则无需单独写一个自定义组件文件,可直接在使用方内进行定义。
即UI元素复用机制@Builder,@Builder所装饰的函数遵循build()函数语法规则,开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。
定义一个自定义构建函数:
@Builder myBuilderComponent(){ // todo }
在使用方内使用:
this.myBuilderComponent()
全局自定义构建函数
定义,即多加function
@Builder function myGlobalBuilderComponent(){ Text('这是全局自定义构建函数') .fontSize(20) .fontColor(Color.Red) }
使用
myGlobalBuilderComponent()
注意:全局的自定义构建函数可以被整个应用获取,不允许使用this和bind方法。
规则:
- 参数的类型必须与参数声明的类型一致,不允许
undefined
、null
和返回undefined
、null
的表达式。 - 在自定义构建函数内部,不允许改变参数值。如果需要改变参数值,且同步回调用点,建议使用@Link。
- @Builder内UI语法遵循UI语法规则。
- 只有传入一个参数,且参数需要直接传入对象字面量才会按引用传递该参数,其余传递方式均为按值传递。
一、按引用传递参数
按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。ArkUI提供$$
作为按引用传递参数的范式。
如下示例,传递参数 message给自定义构建函数,使用按引用传递方式,当点击button改变message值的时候,会导致@Builder方法内的UI刷新
// 参数传递规则示例 @Entry @Component struct ParmsTest { @State message: string = 'Hello World' build() { Row() { Column(){
// 使用自定义构建函数,传入值message myComponentView({showContent: this.message}) Button('点击修改内容') .fontSize(30) .type(ButtonType.Capsule) .onClick(()=>{ this.message = '内容变化' }) } } .height('100%') } } // 定义一个全局自定义构建函数 // 使用按引用传值方式 @Builder function myComponentView($$: { showContent: string }){ Row(){ Text($$.showContent) .fontSize(20) .fontColor(Color.Red) } }
二、按值传递参数
调用@Builder装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新。所以当使用状态变量的时候,推荐使用按引用传递。
如下示例,传递参数 message给自定义构建函数,使用按值传递方式,当点击button改变message值的时候,并不会导致@Builder方法内的UI刷新
// 参数传递规则示例 @Entry @Component struct ParmsTest { @State message: string = 'Hello World' build() { Row() { Column(){ otherComponent(this.message,'按值传递参数') Button('点击修改内容') .fontSize(30) .type(ButtonType.Capsule) .onClick(()=>{ this.message = '内容变化' }) } } .height('100%') } } // 定义一个全局自定义构建构建函数 // 使用按值传递参数方式 @Builder function otherComponent(showContent:string,typeContent:string){ Column(){ Text(showContent) .fontSize(30) .fontColor(Color.Blue) Text('传递方式:'+typeContent) .fontSize(30) .fontColor(Color.Blue) } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下