一、基本概念

1. @Provide与@Consume:跨组件树双向同步

这对装饰器实现了任意层级组件间的双向数据绑定。@Provide在祖先组件中声明共享状态,@Consume在后代组件中消费该状态,形成类似"发布-订阅"的机制。其突破传统父子传参的限制,支持组件树中任意层级的通信。

  • 自动广播机制:@Provide变量变更时,所有关联@Consume组件自动更新
  • 别名匹配规则:支持通过相同变量名或别名建立绑定(如@Provide(‘count’)与@Consume(‘count’))
  • 类型严格校验:要求@Provide与@Consume变量类型完全一致
  • 支持ObjectClassArray等复杂类型

2. @Observed与@ObjectLink:深度数据观察

这对装饰器专为解决嵌套对象/数组的深度监听问题而设计。传统@State只能感知对象引用的变化,而@Observed通过代理机制实现对类属性的细粒度观察,@ObjectLink则建立与父组件@Observed实例的双向绑定。

  • 支持多层嵌套属性变更(如user.address.city)
  • 支持MapSet等复杂数据结构(需API 11+)
  • 可观察数组元素的增删改操作, 数组操作需保持引用(如this.order.items = [...this.order.items])
  • 类对象属性的原子级更新触发UI刷新
  • 原子同步:@ObjectLink建立与父组件@Observed实例的直接引用关系,避免整体对象替换的性能损耗
  • 批量更新:使用requestAnimationFrame合并多次属性修改,减少渲染次数
  • 局部更新控制:通过@Track标记需要观察的属性
  • 惰性加载:对深层嵌套数据动态加载@Observed类,降低内存占用
  • 精准监听:通过@Track标记关键属性,避免全量更新(如仅监听user.name)
  • 避免混用装饰器:@Observed类不可与其他类装饰器(如@Serializable)共用

二、使用方法

1. @Provide与@Consume

// 祖先组件提供共享主题配置
@Component
struct ThemeProvider {
        
        
  @Provide themeConfig = {
        
         
    primaryColor: '#2196F3',
    fontSize: 16
  }
}

// 深层子组件消费配置
@Component
struct ButtonComponent {
        
        
  @Consume themeConfig: ThemeConfig
  
  build() {
        
        
    Button('提交')
      .backgroundColor(this.themeConfig.primaryColor)