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);
}
}
}