@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代理)
问题:二维数组如何深度监听,实现响应式???