HarmonyOS 使用了Observed界面仍然不刷新

@Entry
@Component
struct Index {

  @State a : A = new A()

  build() {
    Column() {
      Child({a:this.a}).width('100%').height('100%')
    }
  }
}

@Component
struct Child{
  @ObjectLink a:A
  build() {
    Text(this.a.b.name).width('100%').height('100%').onClick(()=>{
      this.a.b.name = "222222"
    })
  }
}

@Observed
class A {
  b:B = new B()
}

@Observed
class B {
  name:string = '11111'

  constructor(name: string = "11111") {
    this.name = name;
  }
}

上面的代码,点击后,为什么界面不会刷新

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

无法观察嵌套在属性中的属性,即this.a.b.name(属性c是内嵌在b中的对象classC的属性)。

为了观察到嵌套于内部的ClassC的属性,需要做如下改变:

1、构造一个子组件,用于单独渲染ClassB的实例。 该子组件可以使用@ObjectLink b : ClassB。通常会使用@ObjectLink,除非子组件需要对其ClassC对象进行本地修改。

2、嵌套的ClassC必须用@Observed装饰。当在ClassA中创建ClassB对象时,它将被包装在ES6代理中,当ClassB属性更改时(this.b.name = “222222”),该代码将修改通知到@ObjectLink变量。

具体内容可参考常见问题:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-observed-and-objectlink-V5#在子组件中给objectlink装饰的变量赋值

以下是更改demo:

@Entry
@Component
struct Index {
  @State a: A = new A()
  build() {
    Column() {
      Button("Change a.b.name")
        .onClick(() => {
          this.a.b.name = '父组件改变';
        })

      Child({b:this.a.b}).width('100%').height('100%')

    }
  }
}

@Component
struct Child{
  @ObjectLink b:B
  build() {
    Text(this.b.name).width('20%').height('20%').onClick(()=>{
      this.b.name = "222222"
    }).backgroundColor(Color.Red)
  }
}

@Observed
class A {
  b:B = new B()
}
@Observed
class B {
  name: string = '111111'
  constructor(name: string = "11111") {
    this.name = name;
  }
}
分享
微博
QQ
微信
回复
2天前
相关问题
HarmonyOS 深色模式切换后界面刷新
38浏览 • 1回复 待解决
HarmonyOS @Observed生效问题
481浏览 • 1回复 待解决
HarmonyOS使用@ObjectLink 数据刷新
800浏览 • 2回复 待解决
@State 修饰的变量值改变,界面刷新
1604浏览 • 1回复 待解决
HarmonyOS 界面信息刷新
291浏览 • 1回复 待解决
HarmonyOS UI刷新
33浏览 • 1回复 待解决
修改ForEach使用的数据对象,UI刷新
1875浏览 • 1回复 待解决
HarmonyOS UI刷新问题
34浏览 • 1回复 待解决
IF条件变化后UI刷新
783浏览 • 1回复 待解决
HarmonyOS 装饰器刷新问题
235浏览 • 1回复 待解决
HarmonyOS @builder方法的ui刷新
59浏览 • 1回复 待解决