HarmonyOS NEXT开发条记:类属性变革观测详解@ObservedV2与@Trace

[复制链接]
发表于 2026-1-13 08:56:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  鸿蒙开发往期必看:
一分钟相识”纯血版!鸿蒙HarmonyOS Next应用开发!
“非常具体的” 鸿蒙HarmonyOS Next应用开发学习门路!(从零底子入门到夺目)
“一杯冰美式的时间” 相识鸿蒙HarmonyOS Next应用开发路径!
<hr> 为了增强状态管理框架对类对象中属性的观测本事,开发者可以使用@ObservedV2装饰器和@Trace装饰器装饰类以及类中的属性。
   分析
  @ObservedV2与@Trace装饰器从API version 12开始支持。
  当前状态管理(V2试用版)仍在渐渐开发中,干系功能尚未成熟,发起开发者尝鲜试用。
  概述

@ObservedV2装饰器与@Trace装饰器用于装饰类以及类中的属性,使得被装饰的类和属性具有深度观测的本事:

      
  • @ObservedV2装饰器与@Trace装饰器须要共同使用,单独使用@ObservedV2装饰器或@Trace装饰器没有任何作用。  
  • 被@Trace装饰器装饰的属性property变革时,仅会关照property关联的组件举行革新。  
  • 在嵌套类中,嵌套类中的属性property被@Trace装饰且嵌套类被@ObservedV2装饰时,才具有触发UI革新的本事。  
  • 在继承类中,父类或子类中的属性property被@Trace装饰且该property地点类被@ObservedV2装饰时,才具有触发UI革新的本事。  
  • 未被@Trace装饰的属性用在UI中无法感知到变革,也无法触发UI革新。  
  • @ObservedV2的类实例现在不支持使用JSON.stringify举行序列化。
状态管理V1版本对嵌套类对象属性变革直接观测的范围性

现有状态管理V1版本无法实现对嵌套类对象属性变革的直接观测。
  1. @Observed
  2. class Father {
  3.   son: Son;
  4.   constructor(name: string, age: number) {
  5.     this.son = new Son(name, age);
  6.   }
  7. }
  8. @Observed
  9. class Son {
  10.   name: string;
  11.   age: number;
  12.   constructor(name: string, age: number) {
  13.     this.name = name;
  14.     this.age = age;
  15.   }
  16. }
  17. @Entry
  18. @Component
  19. struct Index {
  20.   @State father: Father = new Father("John", 8);
  21.   build() {
  22.     Row() {
  23.       Column() {
  24.         Text(`name: ${this.father.son.name} age: ${this.father.son.age}`)
  25.           .fontSize(50)
  26.           .fontWeight(FontWeight.Bold)
  27.           .onClick(() => {
  28.             this.father.son.age++;
  29.           })
  30.       }
  31.       .width('100%')
  32.     }
  33.     .height('100%')
  34.   }
  35. }
复制代码
上述代码中,点击Text组件增长age的值时,不会触发UI革新。由于在现有的状态管理框架下,无法观测到嵌套类中属性age的值变革。V1版本的办理方案是使用@ObjectLink装饰器与自界说组件的方式实现观测。
  1. @Observed
  2. class Father {
  3.   son: Son;
  4.   constructor(name: string, age: number) {
  5.     this.son = new Son(name, age);
  6.   }
  7. }
  8. @Observed
  9. class Son {
  10.   name: string;
  11.   age: number;
  12.   constructor(name: string, age: number) {
  13.     this.name = name;
  14.     this.age = age;
  15.   }
  16. }
  17. @Component
  18. struct Child {
  19.   @ObjectLink son: Son;
  20.   build() {
  21.     Row() {
  22.       Column() {
  23.         Text(`name: ${this.son.name} age: ${this.son.age}`)
  24.           .fontSize(50)
  25.           .fontWeight(FontWeight.Bold)
  26.           .onClick(() => {
  27.             this.son.age++;
  28.           })
  29.       }
  30.       .width('100%')
  31.     }
  32.     .height('100%')
  33.   }
  34. }
  35. @Entry
  36. @Component
  37. struct Index {
  38.   @State father: Father = new Father("John", 8);
  39.   build() {
  40.     C
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表