HarmonyOS组件装饰器-@LocalBuilder

102 阅读1分钟
1. 说明
  • 解决组件的父子关系和状态管理的父子关系保持一致的问题。
  • 只能组件内定义(局部)

2. 定义

@LocalBuilder MyBuilderFunction() { ... }

  • 规则:

    • 允许在自定义组件内定义一个或多个@LocalBuilder方法,该方法被认为是该组件的私有、特殊类型的成员函数
    • 自定义构建函数可以在所属组件的build方法和其他自定义构建函数中调用,但不允许在组件外调用。
    • 在自定义函数体中,this指代当前所属组件,建议通过this直接访问状态变量而不是入参。
  • 限制条件:

    • @LocalBuilder只能在所属组件内声明,不允许全局声明。
    • @LocalBuilder不能被内置装饰器和自定义装饰器使用。
    • 自定义组件内的静态方法不能和@LocalBuilder一起使用。
3. 传递参数
  • 引用传递:

    • @LocalBuilder入参为对象字面量,其中使用了状态变量,其值的改变会引起UI刷新。
    • 子组件调用父组件的@LocalBuilder函数,传入的参数为状态变量,其值的改变,不会引起UI刷新。原因是@Localbuilder装饰的函数绑定在父组件上,状态变量刷新机制是刷新本组件以及其子组件,对父组件无影响,故无法引发刷新。若使用@Builder修饰则可引发刷新,原因是@Builder改变了函数的this指向,此时函数被绑定到子组件上,故能引发UI刷新。
  • 值传递:

    • 当传递的参数为状态变量时,状态变量的改变不会引起@LocalBuilder方法内的UI刷新。
@Entry
@Component
struct Parent {
  @State label: string = 'Hello';

  @LocalBuilder
  citeLocalBuilder(paramA1: string) {
    Row() {
      Text(`UseStateVarByValue: ${paramA1} `)
    }
  }

  build() {
    Column() {
      this.citeLocalBuilder(this.label);
    }
  }
}