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
使用@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装饰器配合使用。针对你的数据结构,建议这样实现:
- 首先使用@Observed装饰你的数据类:
[@Observed](/user/Observed)
export class SubjectLeaderDataLeaderInfoList {
name?: string
position?: string
introduction?: string
img?: string
newsId?: string
headline?: string
specialDetailList?: Array<SubjectNewsDetailDataSpecialDetailList>
}
- 在UI组件中使用@ObjectLink绑定嵌套数组:
@Component
struct LeaderInfoView {
[@ObjectLink](/user/ObjectLink) leaderInfo: SubjectLeaderDataLeaderInfoList
build() {
Column() {
// 显示leaderInfo基础信息
// ...
// 遍历specialDetailList
ForEach(this.leaderInfo.specialDetailList, (item) => {
DetailItemView({ detail: item })
})
}
}
}
- 当需要更新specialDetailList时,请使用整个新数组替换旧数组,而不是直接修改原数组:
// 正确方式 - 触发UI刷新
this.leaderInfo.specialDetailList = [...newDetails];
// 错误方式 - 不会触发UI刷新
this.leaderInfo.specialDetailList.push(newItem);
这种方案利用了ArkUI的响应式系统,当specialDetailList被整体替换时,会触发关联UI组件的重新渲染。