
回复
@Provider和@Consumer用于跨组件层级数据双向同步,可以使得开发者不用拘泥于组件层级
能力 | V2装饰器@Provider和@Consumer | V1装饰器@Provide和@Consume |
---|---|---|
@Consume® | 允许本地初始化,当找不到@Provider的时候使用本地默认值。 | 禁止本地初始化,当找不到对应的@Provide时候,会抛出异常。 |
支持类型 | 支持function。 | 不支持function。 |
观察能力 | 仅能观察自身赋值变化,如果要观察嵌套场景,配合@Trace一起使用。 | 观察第一层变化,如果要观察嵌套场景,配合@Observed和@ObjectLink一起使用 |
alias和属性名 | alias是唯一匹配的key,缺省时默认属性名为alias。 | alias和属性名都为key,优先匹配alias,匹配不到可以匹配属性名。 |
@Provide® 从父组件初始化 | 不允许。 | 允许。 |
@Provide®支持重载 | 默认开启,即@Provider可以重名,@Consumer向上查找最近的@Provider。 | 默认关闭,即在组件树上不允许有同名@Provide。如果需要重载,则需要配置allowOverride |
@Entry
@ComponentV2
struct test3{
@Provider() message:string='Hello World'
@Provider('msg') once_message:string='Hello World'
build() {
Column({space:20}){
Text('父布局:'+this.message).fontSize(20).fontColor(Color.Red)
Text('父布局:'+this.once_message).fontSize(20).fontColor(Color.Red)
Button('刷新').onClick(()=>{
this.message='Hello HarmonyOS '+Math.floor(Math.random() * 11)
this.once_message='Hello HarmonyOS '+Math.floor(Math.random() * 11)
})
child1()
}.width('100%')
.height('100%')
}
}
@ComponentV2
struct child1{
@Consumer() message:string ='message'
//参数名不同,没有设置别名,查找不到父布局中的Provider无法刷新
@Consumer() child_message:string ='child_message'
//定义了别名,可以通过别名查找到父布局中的Provider 参数名可以不同
@Consumer('msg') once_message:string='once_message'
@Consumer('msg') childOnceMsg:string='childOnceMsg'
build() {
Column(){
Text('子布局:'+this.message).fontSize(20)
Text('子布局:'+this.child_message).fontSize(20).fontColor(Color.Red)
Text('子布局:'+this.once_message).fontSize(20)
Text('子布局:'+this.childOnceMsg).fontSize(20)
Button('子布局刷新').onClick(()=>{
this.message='Hello'+Math.floor(Math.random() * 11)
this.once_message='Hi'+Math.floor(Math.random() * 11)
})
}
}
}