HarmonyOS @Observed装饰器问题咨询

在使用@Observed装饰器和@ObjectLink装饰器时,没有实现感知嵌套类对象属性变化,如下:

1、定义一个子组件ChildB。

2、ChildB中使用@ObjectLink修饰变量b。

3、期望点击父View Button(Parent:Change ClassA.a)或子View Button(ChildB:Change ClassA.a)时,能够感知到变化,但是并没有感知到。

HarmonyOS
2天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

若想Text(a: ${this.b.classA.a})这块视图更新需要单独抽成组件,参考示例如下:

//当State修饰一个变量的时候,第一层可以监听到,再深层则监听不到
//第一个button:修改嵌套超过两层,所以UI未更新 但是ChildA传递参数是  @ObjectLink修饰的可以使UI更新
//第二个button:修改的是变量的第一层,UI可以更新
//第三个button:因为传递a是经过@ObjectLink修饰的,修改第一层UI可以更新
//第四个button:和第一个Button效果是一样的,若是想修改a的值需要把Text组件单独抽出来成组件,像组件ChildA一样
//对于嵌套层次多的变量,@Observed和@ObjectLink要一起使用,对于要修改的要单独抽成组件,该组件的视图可以更新
@Entry
@Component
export struct ObservedPage {
  @State b: ClassB = new ClassB(new ClassA(10), 20)

  build() {
    Column({ space: 10 }) {

      // Text(`a: ${this.b.classA.a}`)  //Text组件要抽成ChildC组件
      ChildC({
        a: this.b.classA
      })
      Button("Parent:Change ClassA.a")
        .onClick(() => {
          this.b.classA.a += 1
        })

      Text(`b: ${this.b.b}`)
        .margin({ top: 30 })
      Button("Parent:Change ClassB.b")
        .onClick(() => {
          this.b.b += 1
        })

      ChildA({ a: this.b.classA })
        .margin({ top: 30 })

      ChildB({ b: this.b })
        .margin({ top: 30 })

    }
    .width('100%')
    .alignItems(HorizontalAlign.Center)

  }
}

@Component
struct ChildA {
  @ObjectLink a: ClassA;

  build() {
    Column({ space: 10 }) {
      Text(`a: ${this.a.a}`)
      Button("ChildA:Change ClassA.a")
        .onClick(() => {
          this.a.a += 1
        })
    }
  }
}

@Component
struct ChildC {
  @ObjectLink a: ClassA;

  build() {
    Column({ space: 10 }) {
      Text(`a: ${this.a.a}`)
    }
  }
}

@Component
struct ChildB {
  @ObjectLink b: ClassB;

  build() {
    Column({ space: 10 }) {
      // Text(`a: ${this.b.classA.a}`) //Text组件要抽成ChildC组件
      ChildC({
        a: this.b.classA
      })
      Button("ChildB:Change ClassA.a")
        .onClick(() => {
          this.b.classA.a += 1 //抽成组件监听
        })
    }
  }
}

@Observed
class ClassA {
  a: number

  constructor(a: number) {
    this.a = a
  }
}

@Observed
class ClassB {
  classA: ClassA
  b: number

  constructor(classA: ClassA, b: number) {
    this.classA = classA
    this.b = b
  }
}
分享
微博
QQ
微信
回复
2天前
相关问题
HarmonyOS装饰或注解实现方式咨询
492浏览 • 1回复 待解决
HarmonyOS 装饰问题class
38浏览 • 1回复 待解决
HarmonyOS 装饰不刷新问题
235浏览 • 1回复 待解决
HarmonyOS 关于组件装饰问题
25浏览 • 1回复 待解决
重力传感相关问题咨询
373浏览 • 1回复 待解决
HarmonyOS @Observed不生效问题
481浏览 • 1回复 待解决
自定义装饰的使用问题
832浏览 • 1回复 待解决
状态装饰 ui不刷新的问题
2476浏览 • 1回复 待解决
HarmonyOS 计步传感相关问题咨询
248浏览 • 1回复 待解决
HarmonyOS @Concurrent装饰报错
74浏览 • 1回复 待解决
装饰 @Styles 和 @Extend
450浏览 • 1回复 待解决
HarmonyOS 怎么自定义装饰
36浏览 • 1回复 待解决
HarmonyOS卡片问题咨询
338浏览 • 1回复 待解决