HarmonyOS鸿蒙Next中V1状态管理能实现监听 map存入的value值修改吗
【问题分析】
楼主关注的深层状态变量监听以及刷新UI是可以实现的
【解决方案】
楼主不想使用@ObjectLink可以增加@Track在组件中使用@State来装饰,下面是修改后的示例楼主可以参考一下,希望对你有帮助
[@Observed](/user/Observed)
class Info {
public info: MyMap<number, string>;
constructor(info: MyMap<number, string>) {
this.info = info;
}
}
[@Observed](/user/Observed)
export class MyMap<K, V> extends Map<K, V> {
[@Track](/user/Track) public name: string;
constructor(name?: string, args?: [K, V][]) {
super(args);
this.name = name ? name : 'My Map';
}
getName() {
return this.name;
}
}
@Entry
@Component
struct FocusTestPage {
[@State](/user/State) message: Info = new Info(new MyMap('myMap', [[0, 'a'], [1, 'b'], [3, 'c']]));
build() {
Row() {
Column() {
MapSampleNestedChild({ myMap: this.message.info })
}
.width('100%')
}
.height('100%')
}
}
@Component
struct MapSampleNestedChild {
[@State](/user/State) myMap: MyMap<number, string> = new MyMap()
build() {
Row() {
Column() {
ForEach(Array.from(this.myMap.entries()), (item: [number, string]) => {
Text(`${item[0]}`).fontSize(30)
Text(`${item[1]}`).fontSize(30)
Divider().strokeWidth(5)
})
Button('set new one')
.width(200)
.margin(10)
.onClick(() => {
this.myMap.set(4, 'd');
})
Button('clear')
.width(200)
.margin(10)
.onClick(() => {
this.myMap.clear();
})
Button('replace the first one')
.width(200)
.margin(10)
.onClick(() => {
this.myMap.set(0, 'aa');
})
Button('delete the first one')
.width(200)
.margin(10)
.onClick(() => {
this.myMap.delete(0);
})
}
.width('100%')
}
.height('100%')
}
}
【参考文档】
[@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化-管理组件拥有的状态-状态管理(V1)-学习UI范式状态管理-UI开发 (ArkTS声明式开发范式)-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-observed-and-objectlink#继承map类)
更多关于HarmonyOS鸿蒙Next中V1状态管理能实现监听 map存入的value值修改吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
从API version 11开始,@ObjectLink支持@Observed装饰Map类型和继承Map类的类型。
@ObjectLink只能在子组件中使用
但我的场景就在本组件使用,与子组件无关。
可以附一下你场景的抽象结构,用代码来表示你的意思,
在HarmonyOS Next的ArkUI状态管理中,使用[@Observe](/user/Observe)和[@Track](/user/Track)修饰的statusMap能够监听value值的变化并触发UI刷新。具体机制如下:
-
@Track的作用:当
[@Track](/user/Track)修饰statusMap时,框架会追踪Map中每个key对应的value变化。如果某个value被修改(包括对象属性变化或重新赋值),框架会检测到这一变更。 -
监听触发条件:
- 直接修改Map中已存在key的value:
this.statusMap.set(key, newValue) - 如果value是对象,修改该对象的属性(需确保对象本身也被@Track修饰)
- 删除或新增key不会触发value变化的监听
- 直接修改Map中已存在key的value:
-
UI更新:当监听到value变化时,所有依赖该value的UI组件会自动刷新。
示例代码:
[@Observe](/user/Observe)
class Data {
[@Track](/user/Track) statusMap: Map<string, number> = new Map()
updateValue(key: string, value: number) {
this.statusMap.set(key, value) // 触发监听和UI更新
}
}
注意事项:
这种设计能够满足对Map值变化的监听需求,同时保持状态管理的效率。

