写点什么

鸿蒙 Next 状态管理装饰器 V2 @ObservedV2@Trace@Local

作者:auhgnixgnahz
  • 2025-06-23
    北京
  • 本文字数:1254 字

    阅读完需:约 4 分钟

本文先记录 @ObservedV2 装饰器 @Trace 装饰器 @Local 装饰器


当我们的数据结构有嵌套对象时,当只有嵌套对象属性发生变化,这时不能触发 View 刷新,看一下效果图和代码:



@Observedclass Child{  name:string='child'}@Observedclass Father{  name:string='father'  child:Child=new Child();}@Entry@Componentstruct test{  @State father:Father = new Father()  build() {    Stack(){      Column({space:30}){        Text(this.father.name).fontSize(30).fontColor(Color.Black)        Text(this.father.child.name).fontSize(30).fontColor(Color.Gray)
Row(){ Button('改变child属性').onClick(()=>{ //只有嵌套类对对象属性变化不能被监听到 this.father.child.name='child2' }) Button('改变father属性').onClick(()=>{ this.father.name='father2' }) } } }.alignContent(Alignment.Center) .width('100%') .height('100%') }}
复制代码


为了解决这种需求,需要引入 V2 所属装饰器,为了增强状态管理框架对类对象中属性的观测能力,开发者可以使用 @ObservedV2 装饰器和 @Trace 装饰器装饰类以及类中的属性。


概述


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


@ObservedV2 装饰器与 @Trace 装饰器需要配合使用,单独使用 @ObservedV2 装饰器或 @Trace 装饰器没有任何作用。


被 @Trace 装饰器装饰的属性 property 变化时,仅会通知 property 关联的组件进行刷新。


在嵌套类中,嵌套类中的属性 property 被 @Trace 装饰且嵌套类被 @ObservedV2 装饰时,才具有触发 UI 刷新的能力。


在继承类中,父类或子类中的属性 property 被 @Trace 装饰且该 property 所在类被 @ObservedV2 装饰时,才具有触发 UI 刷新的能力。


未被 @Trace 装饰的属性用在 UI 中无法感知到变化,也无法触发 UI 刷新。


@ObservedV2 的类实例目前不支持使用 JSON.stringify 进行序列化。



@ObservedV2class Child{  @Trace name:string='child'}@ObservedV2class Father{  @Trace name:string='father'  child:Child=new Child();}@Entry@ComponentV2struct test2{  father:Father = new Father()  @Local message: string = "Hello";  build() {    Stack(){      Column({space:10}){        Text(this.message).fontSize(30)        Text(this.father.name).fontSize(30)        Text(this.father.child.name).fontSize(30)        Row(){          Button('locak修饰').onClick(()=>{            this.message='world'          })          Button('改变child属性').onClick(()=>{            this.father.child.name='child2'          })          Button('改变father属性').onClick(()=>{            this.father.name='father2'          })        }      }    }.alignContent(Alignment.Center)    .width('100%')    .height('100%')  }}
复制代码


发布于: 刚刚阅读数: 4
用户头像

auhgnixgnahz

关注

还未添加个人签名 2018-07-10 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙Next状态管理装饰器V2 @ObservedV2@Trace@Local_auhgnixgnahz_InfoQ写作社区