鸿蒙Next状态管理装饰器V2 @Provider @Consumer 原创

auhgnixgnahz
发布于 2025-6-12 17:35
浏览
0收藏

@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

鸿蒙Next状态管理装饰器V2 @Provider @Consumer-鸿蒙开发者社区

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

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
收藏
回复
举报
回复
    相关推荐