HarmonyOS 鸿蒙Next关于ObjectLink属性变化更新UI的疑问

发布于 1周前 作者 gougou168 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next关于ObjectLink属性变化更新UI的疑问

下面是我的代码,这种方式person的name属性更新,会更新到UI,没有问题。


[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
  [@State](/user/State) [@Watch](/user/Watch)("personChange") persons: Person[] = []

  aboutToAppear(): void {
    const person: Person = new Person()
    this.persons.push(person)
  }

  build() {
    Column() {
      ForEach(this.persons, (item: Person, index) => {
        PersonView({ person: item })
      })
    }.height('100%')
    .width('100%')
  }

  personChange(changedPropertyName: string) {
    setTimeout(() => {
    //延迟一秒更新person的属性
      this.persons[0].name = '张三'
    }, 1000)
  }
}

@Component
struct PersonView {
  @ObjectLink person: Person

  build() {
    Text("person.name = " + this.person.name)
  }
}

@Observed
export class Person {
  name: string = ''
  age: number = 0
}
 

但是如果我把Person对象的创建方式改一下,改为:

...
 aboutToAppear(): void {
    const person: Person = {name: '', age: 0}
    this.persons.push(person)
  }
...
 

然后再运行,person属性的变化就不会更新到UI了。这是为什么呢?

还有,如果我把personChange方法中的延时一秒更新person属性去掉,改为直接更新,就又可以更新UI了~实在是不理解

  personChange(changedPropertyName: string) {
    this.persons[0].name = '张三'
  }
1 回复

作为IT专家,对于HarmonyOS 鸿蒙Next关于@ObjectLink属性变化更新UI的问题,我可以提供以下解答:

在HarmonyOS 鸿蒙Next中,@ObjectLink@Observed装饰器用于实现嵌套对象或数组的场景中的双向数据同步。当嵌套对象的属性发生变化时,为了确保UI能够正确刷新,需要遵循以下几点:

  1. 确保所有嵌套层级的对象类都被@Observed装饰。这是因为@Observed装饰器用于观察对象类属性的变化,如果嵌套对象的类没有被@Observed装饰,那么其属性的变化将无法被观察到。
  2. 在子组件中,使用@ObjectLink装饰的状态变量来接收@Observed装饰的类的实例,并与父组件中对应的状态变量建立双向数据绑定。
  3. 注意,@ObjectLink装饰的变量不能被赋值,赋值会打断同步链。如果需要赋值操作,请使用@Prop装饰器,但请注意@Prop装饰的变量与数据源的关系是单向同步的。

如果在遵循以上几点后,UI仍然无法更新,可能是因为存在其他因素影响了数据同步。此时,建议检查代码中是否存在其他逻辑错误或数据绑定问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。希望这些信息能对你有所帮助。

回到顶部