概述:
当开发者使用@Builder做引用数据传递时,会考虑组件的父子关系,使用了bind(this)之后,组件的父子关系和状态管理的父子关系并不一致。
为了解决组件的父子关系和状态管理的父子关系保持一致的问题,引入@LocalBuilder装饰器。
@LocalBuilder拥有和局部@Builder相同的功能,且比局部@Builder能够更好的确定组件的父子关系和状态管理的父子关系。
示例:
1、定义自定义组件
// 自定义组件 @Component export struct CommonView{@State msg:string = "子 Child"@Builder customBuilder() {};@BuilderParam customBuilderParam:()=>void=this.customBuilderbuild() {Column() {this.customBuilderParam()}} }
2、使用该自定义组件
import { CommonView } from "../components/CommonView"; @Entity @Component export struct Main {@State msg:string = "父Parent"// 通过this.componentBuilder的形式传给子组件@BuilderParam customBuilderParam,this指向在Child的label,即“Child”。 @Builder customerBuilder(){Text(this.msg)}// 过this.componentBuilder的形式传给子组件@BuilderParam customBuilderParam,this指向Parent的label,即“Parent”。 @LocalBuilder customerBuilder(){Text(this.msg)}build() {Column() {Text('Main')CommonView({customBuilderParam:this.customerBuilder})Text('End')}.width('100%').justifyContent(FlexAlign.Center)} }
使用@Builder装饰的效果图:
使用@LocalBuilder装饰的效果图:
@LocalBuilder和@Builder区别说明
说明:
@Builder componentBuilder()通过this.componentBuilder的形式传给子组件@BuilderParam customBuilderParam,this指向在Child的label,即“Child”。
@LocalBuilder componentBuilder()通过this.componentBuilder的形式传给子组件@BuilderParam customBuilderParam,this指向Parent的label,即“Parent”。