鸿蒙eTS状态管理Observed和ObjectLink

  • @Observed应用于类,表示该类中的数据变更被UI页面管理,例如:@Observed class ClassA {}。
  • @ObjectLink应用于被@Observed所装饰类的对象,例如:@ObjectLink a: ClassA。

适应场景:子组件监听类的嵌套的属性,如下:Observer_sub1_page 子组件监听 ClassAAA对象中的ClassBBB中的bbb_a属性

class ClassAAA {
  public c: ClassBBB
  constructor(cValue: ClassBBB) {
    this.c = cValue;
  }
}

@Observed
class ClassBBB {
  public bbb_a: string
  constructor(aValue: string = 'ok') {
    this.bbb_a = aValue;
  }
}

@Entry
@Component
struct Observer_page {

  @State aaa: ClassAAA = new ClassAAA(new ClassBBB());

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      // 注意:这里不会改变
      Text(`ClassBBB的bbb_a值:${this.aaa.c.bbb_a}`)
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          // 修改值,只会导致 @ObjectLink 装饰的变量所在的组件被刷新,当前组件不会刷新
          this.aaa.c.bbb_a = "11111"
        })
      Observer_sub1_page({bbb: this.aaa.c})
    }
    .width('100%')
    .height('100%')
  }
}

@Component
struct Observer_sub1_page {

  @ObjectLink bbb: ClassBBB

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Text(`ClassBBB的bbb_a值:${this.bbb.bbb_a}`)
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          // 修改值,只会导致 @ObjectLink 装饰的变量所在的组件被刷新,父组件不会被刷新
          this.bbb.bbb_a = "22222"
        })
    }
    .width('100%')
    .height('100%')
  }
}

 注意:@State无法监听到类嵌套类的属性,@ObjectLink可以监听到类嵌套@Observed修饰的类的属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值