Harmony-状态管理2

145 阅读2分钟

@Link装饰器:父子双向同步

1.概念:@Link装饰的变量与其父组件中的数据源共享相同的值。

2.框架行为:

  • 初始渲染:父组件的@State状态变量包装类通过构造函数传给子组件,子组件的@Link包装类拿到后再将当前@Link包装类this指针注册给父组件的@State变量;
  • @Link的数据源更新:父组件中状态变量更新,引起相关子组件的@Link的更新;
  • @Link的更新:@Link更新后,调用父组件的@State包装类的set方法,将更新后的数值同步回父组件。

3.特点:

  • @Link装饰器不能在@Entry装饰的自定义组件中使用;
  • @Link装饰的变量禁止本地初始化,否则编译期会报错;
  • @Link装饰的变量的类型要和数据源类型保持一致(依赖数据源传过来的值作为初始值),否则框架会抛出运行时错误。

4.使用场景:

  • 简单类型和类对象类型
  • 数组类型
  • Map、Set类型
  • 使用双向同步机制更改本地其他变量(利用装饰器@Watch)

5.常见bug:

  • @Link装饰状态变量类型错误(与数据源的类型相异)
  • 使用a.b(this.object)形式调用,不会触发UI刷新(新赋值,再加上Proxy代理)

@Provide装饰器和@Consume装饰器:与后代组件双向同步

1.概念:@Provide(提供者)装饰的状态变量自动对其所有后代组件可用,通过Consume(消费者)去获取@Provide提供的变量。

2.特点:

  • 摆脱参数传递机制的束缚,实现跨层级传递;
  • @Provide和@Consume通过相同的变量名或者相同的变量别名绑定,类型保持一致(否则可能发生类型隐式转换);
  • @Provider/@Consumer的参数key(设置别名、属性名,是唯一的)必须为string类型,否则编译期会报错;
  • @Consume装饰的变量不能本地初始化,也不能在构造参数中传入初始化,否则编译期会报错。@Consume仅能通过key来匹配对应的@Provide变量进行初始化;
  • 不支持装饰Function类型的变量,框架会抛出运行时错误;
  • 支持allowOverride参数,配置允许重写选项

3.使用场景:

  • 装饰Map、Set类型;
  • Object、class、string、number、boolean、enum类型,以及这些类型的数组;
  • 支持Date类型。

4.常见bug:

  • @BuilderParam尾随闭包情况下@Procide未定义错误(this指向问题,应该将@Provide提到this实际指向某层)
  • 使用a.b(this.object)形式调用,不会触发UI刷新(新赋值,再加上Proxy代理)

问题:二维数组如何深度监听,实现响应式???