HarmonyOS 鸿蒙Next开发,ObjectLink 装饰的数组对象内部属性更改UI不更新问题

发布于 1周前 作者 ionicwang 来自 鸿蒙OS

HarmonyOS 鸿蒙Next开发,ObjectLink 装饰的数组对象内部属性更改UI不更新问题

如下代码所示,在MyComponent定时更新数组MyTestArray中的第一个对象的str属性。UI不刷新MyTestArrayMyTest都是用@Observed装饰了的,同时新建数组的时候都是通过new来的。所以不理解,有大佬帮忙看下原因不?

@Component
export struct MyComponent {
  @ObjectLink data: MyTestArray;

  aboutToAppear() {
    let intervalID = setInterval(() => {
      this.data[0].str++;
      console.info("aboutToAppear " + this.data[0].str);
    }, 2000);
  }

  build() {
    Column() {
      Text(this.data[0].str+"")
        .fontSize(29)
        .width('100%')
        .height('100%');
    }
  }
}

@Observed
export class MyTestArray extends Array<MyTest> {}

@Observed
export default class MyTest {
  constructor(str: number) {
    this.str = str;
  }

  str: number;
}

更多关于HarmonyOS 鸿蒙Next开发,ObjectLink 装饰的数组对象内部属性更改UI不更新问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

@State arrA: ClassA[] = [new ClassA(0), new ClassA(1), new ClassA(2)];

@Observedclass ClassA { public id: number; public c: number; constructor(c: number) { this.id = NextID++; this.c = c; } }

定义为对象数组,可以看看官方文档

https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/arkts-observed-and-objectlink-0000001473697338-V3?catalogVersion=V3

更多关于HarmonyOS 鸿蒙Next开发,ObjectLink 装饰的数组对象内部属性更改UI不更新问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


试了下。目前结论是要想给一个自定义的组件(没有子组件)传递一个对象数组,然后给对象数组传递 装饰 @ObjectLink 是不管用的。@ObjectLink 貌似只能修饰对象 或者 继承了简单类型数组的对象,

ui再提出一层, 把这个提出来 

```kotlin
Text(this.data[0].str+"")
  .fontSize(29)
  .width('100%')
  .height('100%')

升级HarmonyOS后,发现手机的游戏性能也有了显著提升。

我也遇到了这个问题,需要给子组件传递一个对象数组,用@ObjectLink装饰了,并且也用@Observed装饰了类,但是也只能监听到数组的变化,不能监听里面对象属性的变化,实现不了深度监听,有什么好的解决方法吗

  • objectlink修饰的是数组的对象才对,比如有一个列表,那么列表的item用@ObjectLink class A;放列表的父组件对象数组用State就行了,
@Entry@Componentstruct Application_4 {
  @State data: MyTest = new MyTest(2);
  build(){
    Row(){
      MyComponent({data: this.data});
      Text(this.data.toString())
    }
  }
}

@Componentexport struct MyComponent {
  @ObjectLink data: MyTest;
  aboutToAppear(){
    setInterval(() => {
      this.data.str ++ ;
      console.info("aboutToAppear " + this.data.str)
    }, 500);
  }
  build(){
    Column() {
      Text(this.data.str+"").fontSize(29)
        .width('100%')
        .height(100).backgroundColor('#c0c0c0')
    }
  }
}

@Observedclass MyTest {
  str: number;
  constructor(str: number) {
    this.str = str;
  }
}

是这种效果吗?

  • 这个能更新,不过我的最终需求是项进行列表项的更新,只不过贴的代码为了简单,就写了一个数组项,

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

数据是一个对象数组。然后foreach下放到每个item中绑定,但是更新其属性时,对应的item的UI没有刷新。

搞定了吗,

基本信息

这是示例文本

在HarmonyOS鸿蒙Next开发中,若遇到使用ObjectLink装饰的数组对象内部属性更改后UI不更新的问题,通常是因为数据绑定机制未能正确识别到数组内部元素的变化。

HarmonyOS的数据绑定依赖于特定的机制来监听数据模型的变化并更新UI。当数组元素被ObjectLink装饰时,如果数组内部的对象属性发生变化,但绑定机制未能捕获这些变化,UI就不会自动更新。

可能的原因包括:

  1. 数组引用未变:如果仅修改了数组内部对象的属性而未改变数组本身的引用(即未创建新数组或未替换数组中的对象),数据绑定可能无法识别到变化。

  2. 数据绑定设置不当:确保数据绑定正确设置,且能够监听数组内部对象的变化。

解决方法可以尝试:

  • 替换数组元素:当修改数组内部对象的属性时,尝试替换该对象在数组中的位置,而不是直接修改其属性。这可以通过创建一个新对象,设置新属性,并将其放回数组中的相应位置来实现。

  • 使用观察者模式:如果HarmonyOS支持,可以为数组内部对象实现观察者模式,当属性变化时手动通知UI更新。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部