HarmonyOS组件装饰器-@Builder

321 阅读1分钟

1. @Builder:自定义构建函数

  • 组件内构建函数定义: @Builder componentBuildFunc(){}
    自定义函数体中,this指当前所属组件,可以直接访问组件的状态变量
  • 全局构建函数定义: @Builder function globalBuildFunc(){} 如果不涉及组件状态变化,建议使用全局构建函数

2. @Builder参数传递规则 (按值传递和按引用传递)

  1. 参数类型与入参类型一致。
  2. @Builder函数体内,不允许改变参数值。
  3. 只有一个参数,且直接传入对象字面量才会按照引用传递,其余均为按值传递。

3. 入参传递

class TmpString {
  paramsA: string = ''
}

@Entry
@Component
struct ComponentPage {
    @State label: string = 'hello';
    
    //引用传递范式1
    @Builder
    buildText(params: TmpString) {
      Text(`组件内引用入参${params.paramsA}`).fontSize(17).fontColor($r('app.color.text_black_color'))
    }
    
    //引用传递范式2
    buildText($$: TmpString) {
      Text(`组件内引用入参${$$.paramsA}`)
      //调用其他子组件
      ...
    }

    // 值传递,状态变量的修改无法更新UI
    @Builder
    buildText2(text: string) {
      Text(`组件内值入参${text}`).fontSize(17).fontColor($r('app.color.text_black_color'))
    }
    
    build(){
        Column{
            this.buildText({ paramsA: this.label })
            this.buildText2(this.label)
        }
    }
}

4. 限制条件

  • @Builder通过按引用传递的方式传入参数,才会触发动态渲染UI,并且参数只能是一个。
  • @Builder如果传入的参数是两个或两个以上,不会触发动态渲染UI。
  • @Builder传入的参数中同时包含按值传递和按引用传递两种方式,不会触发动态渲染UI。
  • @Builder的参数必须按照对象字面量的形式,把所需要的属性一一传入,才会触发动态渲染UI。