鸿蒙【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方法。

 

规则:

  • 参数的类型必须与参数声明的类型一致,不允许undefinednull和返回undefinednull的表达式。
  • 在自定义构建函数内部,不允许改变参数值。如果需要改变参数值,且同步回调用点,建议使用@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)
  }
}
 
复制代码

 

posted on   youhui  阅读(21)  评论(0编辑  收藏  举报

编辑推荐:
· 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代理 了,记录一下
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示