ArkUI -- @ObservedV2 和 @Trace: 类属性变化观测 (状态管理 V2)
@ObservedV2装饰器和@Trace装饰器:类属性变化观测状态管理V1 版本无法实现对嵌套类对象属性变化的直接观察,通常需要使用 @ObjectLink 装饰器和自定义组件来实现观察,但当嵌套层级较深时,代码会变得是否复杂,易用性差。@ObservedV2 和 @Trace 提供了对嵌套类对象属性变化的直接观察能力。装饰器装饰器参数装饰的类型@ObservedV2无class@Trace无class 中成员属性,属性的类型可为基本数据类型和 Array、Date、Map、Set 等,不支持 Function 类型@ObservedV2 用于装饰类,@Trace 用于装饰类中的属性,使得被装饰的类和属性具有深度观测的能力:@ObservedV2 和 @Trace 需配合使用,单独使用 @ObservedV2 或 @Trace 没有任何作用被 @Trace 装饰的属性的值变化时,仅会通知与其关联的组件进行刷新;未被 @Trace 装饰的属性值的变化无法触发 UI 刷新使用 @ObservedV2 和 @Trace 装饰的类,需通过 new 操作实例化后,才具备被观测变化的能力在继承类中,父类或子类中的属性被 @Trace 装饰,且该属性所在的类被 @ObservedV2 装饰是,才具有 UI 刷新的能力在嵌套类中,嵌套类中的属性被 @Trace 装饰且嵌套类被 @Observed 装饰时,才具有触发 UI 刷新的能力使用限制@Trace 是 class 中属性的装饰器,不能用在 struct 中@ObservedV2 仅能装饰 class,无法装饰自定义组件使用 @ObservedV2 与 @Trace 装饰的类不能和 @State 等V1的装饰器混合使用,编译时报错,需用 @Local 等V2的装饰器继承自 @ObservedV2 的类无法和 @State 等V1的装饰器混合使用,运行时报错@ObservedV2 的类实例无法直接使用 JSON.parse 反序列化获得 (直接使用 JSON.parse 反序列化获得的对象无法观察属性变化)使用场景嵌套类场景// 嵌套类必须被 @ObservedV2 和 @Trace 装饰,才能触发 UI@ObservedV2classUser{@Traceage:number=10;}// 外层的类可以不被 @ObservedV2 和 @Trace 装饰classLogin{user:User=newUser();}@Entry@ComponentV2exportstruct MainPage{// login 的嵌套类 User 被 @ObserveV2 装饰,不可用 @State 等 V1 的装饰器@Locallogin:Login=newLogin();build(){Column({space:20}){Button('change age: '+this.login.user.age).onClick(()={this.login.user.age++})}.width('100%')}}继承类场景@Trace 支持在类的继承场景中使用,无论是在基类还是继承类中,只有被 @Trace 装饰的属性才具有被观测变化的能力。@ObservedV2classUser{// 被 @Trace 装饰,值的变化可触发 UI 刷新@Traceage:number=10;}@ObservedV2classVipextendsUser{// 被 @Trace 装饰,值的变化可触发 UI 刷新@Tracelevel:number=1;// 未被 @Trace 装饰,不会触发 UI 刷新date:string=