HarmonyOS鸿蒙Next中数据结构嵌套二维数组的情况下,如何监测数组数据的变化触发UI的刷新

HarmonyOS鸿蒙Next中数据结构嵌套二维数组的情况下,如何监测数组数据的变化触发UI的刷新

【设备信息】 Mate60pro
【API版本】 Api14
【DevEco Studio版本】 5.0.2 Release

数据接口代码如下

export class SubjectLeaderData{
  backImg?: string
  slogan?: string
  leaderInfoList?: Array<SubjectLeaderDataLeaderInfoList>
  politicalChannelId?: string
}

export class SubjectLeaderDataLeaderInfoList{
  name?: string
  position?: string
  introduction?: string
  img?: string
  newsId?: string
  headline?: string
  specialDetailList?: Array<SubjectNewsDetailDataSpecialDetailList>
}

specialDetailList赋值后,如何触发UI的刷新


更多关于HarmonyOS鸿蒙Next中数据结构嵌套二维数组的情况下,如何监测数组数据的变化触发UI的刷新的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

使用@ObjectLink@Observed类装饰器在涉及嵌套对象或数组的场景中进行双向数据同步:

  • @Observed装饰的类,可以被观察到属性的变化;
  • 子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中的属性,这个属性同样也需要被@Observed装饰。
  • 单独使用@Observed是没有任何作用的,需要搭配@ObjectLink或者@Prop使用。

限制条件

  • 使用@Observed装饰class会改变class原始的原型链,@Observed和其他类装饰器装饰同一个class可能会带来问题。
  • @Observed装饰的类,如果其属性为非简单类型,比如class、Object或者数组,也需要被@Observed装饰,否则将观察不到其属性的变化。

参考demo: 以下是嵌套类对象的数据结构。

let NextID: number = 1;
[@Observed](/user/Observed)
class ClassA {
  public id: number;
  public c: number;
  constructor(c: number) {
    this.id = NextID++;
    this.c = c;
  }
}
[@Observed](/user/Observed)
class ClassB {
  public a: ClassA;
  constructor(a: ClassA) {
    this.a = a;
  }
}
[@Observed](/user/Observed)
class ClassD {
  public c: ClassC;
  constructor(c: ClassC) {
    this.c = c;
  }
}
[@Observed](/user/Observed)
class ClassC extends ClassA {
  public k: number;
  constructor(k: number) {
    // 调用父类方法对k进行处理
    super(k);
    this.k = k;
  }
}

以下组件层次结构呈现的是嵌套类对象的数据结构。 @Component struct ViewC { label: string = ‘ViewC1’; @ObjectLink c: ClassC; build() { Row() { Column() { Text(ViewC [${this.label}] this.a.c = ${this.c.c}) .fontColor(’#ffffffff’) .backgroundColor(’#ff3fc4c4’) .height(50) .borderRadius(25) Button(ViewC: this.c.c add 1) .backgroundColor(’#ff7fcf58’) .onClick(() => { this.c.c += 1; console.log(‘this.c.c:’ + this.c.c) }) } .width(300) } } } @Entry @Component struct ViewB { @State b: ClassB = new ClassB(new ClassA(0)); @State child : ClassD = new ClassD(new ClassC(0)); build() { Column() { ViewC({ label: ‘ViewC #3’, c: this.child.c}) Button(ViewC: this.child.c.c add 10) .backgroundColor(’#ff7fcf58’) .onClick(() => { this.child.c.c += 10 console.log(‘this.child.c.c:’ + this.child.c.c) }) } } }

更多关于HarmonyOS鸿蒙Next中数据结构嵌套二维数组的情况下,如何监测数组数据的变化触发UI的刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,若需监测嵌套二维数组数据变化并触发UI刷新,可以使用@Observed@Tracked装饰器。首先,用@Observed装饰包含二维数组的类,再用@Tracked装饰二维数组。当数组数据变化时,@Tracked会自动触发UI更新。确保在UI组件中使用该数据时,系统能正确响应变化。

在HarmonyOS Next中,要监测嵌套二维数组数据变化并触发UI刷新,可以使用@Observed@ObjectLink装饰器配合使用。针对你的数据结构,建议这样实现:

  1. 首先使用@Observed装饰你的数据类:
[@Observed](/user/Observed)
export class SubjectLeaderDataLeaderInfoList {
  name?: string
  position?: string
  introduction?: string
  img?: string
  newsId?: string
  headline?: string
  specialDetailList?: Array<SubjectNewsDetailDataSpecialDetailList>
}
  1. 在UI组件中使用@ObjectLink绑定嵌套数组:
@Component
struct LeaderInfoView {
  [@ObjectLink](/user/ObjectLink) leaderInfo: SubjectLeaderDataLeaderInfoList

  build() {
    Column() {
      // 显示leaderInfo基础信息
      // ...
      
      // 遍历specialDetailList
      ForEach(this.leaderInfo.specialDetailList, (item) => {
        DetailItemView({ detail: item })
      })
    }
  }
}
  1. 当需要更新specialDetailList时,请使用整个新数组替换旧数组,而不是直接修改原数组:
// 正确方式 - 触发UI刷新
this.leaderInfo.specialDetailList = [...newDetails];

// 错误方式 - 不会触发UI刷新
this.leaderInfo.specialDetailList.push(newItem);

这种方案利用了ArkUI的响应式系统,当specialDetailList被整体替换时,会触发关联UI组件的重新渲染。

回到顶部