V2 装饰器@Monitor 的使用
概念
为了增强状态管理框架对状态变量变化的监听能力,开发者可以使用@Monitor 装饰器对状态变量进行监听。
@Monitor 装饰器用于监听状态变量修改,使得状态变量具有深度监听的能力:
- @Monitor 装饰器支持在@ComponentV2 装饰的自定义组件中使用,未被状态变量装饰器@Local、@Param、@Provider、@Consumer、@Computed 装饰的变量无法被@Monitor 监听到变化。
- @Monitor 装饰器支持在类中与@ObservedV2、@Trace 配合使用,不允许在未被@ObservedV2 装饰的类中使用@Monitor 装饰器。未被@Trace 装饰的属性无法被@Monitor 监听到变化。
- 当观测的属性变化时,@Monitor 装饰器定义的回调方法将被调用。判断属性是否变化使用的是严格相等(===),当严格相等判断的结果是 false(即不相等)的情况下,就会触发@Monitor 的回调。当在一次事件中多次改变同一个属性时,将会使用初始值和最终值进行比较以判断是否变化。
- 单个@Monitor 装饰器能够同时监听多个属性的变化,当这些属性在一次事件中共同变化时,只会触发一次@Monitor 的回调方法。
- @Monitor 装饰器具有深度监听的能力,能够监听嵌套类、多维数组、对象数组中指定项的变化。对于嵌套类、对象数组中成员属性变化的监听要求该类被@ObservedV2 装饰且该属性被@Trace 装饰。
- 当@Monitor 监听整个数组时,更改数组的某一项不会被监听到。无法监听内置类型(Array、Map、Date、Set)的 API 调用引起的变化。
- 在继承类场景中,可以在父子组件中对同一个属性分别定义@Monitor 进行监听,当属性变化时,父子组件中定义的@Monitor 回调均会被调用。
- 和@Watch 装饰器类似,开发者需要自己定义回调函数,区别在于@Watch 装饰器将函数名作为参数,而@Monitor 直接装饰回调函数。
| 特性 | @Monitor | @Watch |
|---|---|---|
| 监听深度 | 支持深层属性监听 | 仅第一层属性监听 |
| 多属性监听 | 支持同时监听多个属性 | 仅支持单个属性监听 |
| 新旧值获取 | 提供变化前后的完整值 | 无法获取旧值 |
| 回调触发机制 | 多属性同事件变化合并触发 | 每个属性变化独立触发 |
| 类属性监听 | 需配合@ObservedV2 和@Trace | 不支持类属性监听 |
1. 深度监听能力
- 支持监听嵌套类、多维数组、对象数组中指定项的变化(需配合@ObservedV2 和@Trace 使用)
- 示例场景:监听用户信息对象中
address.city属性的变化,仅当该属性修改时触发回调
2. 变化值追踪
提供变化前后的值对比能力,通过 monitor.value()?.before 和 monitor.value()?.now 访问新旧值。
3. 多属性联合监听
可同时监听多个属性变化,当多个属性在一次事件中共同变化时,仅触发一次回调:
@Monitor('age', 'height')
onRecordChange(monitor: IMonitor) {
console.log(`年龄或身高变化:, `);
}


