@State装饰嵌套结构的变量时,为什么嵌套结构中数组元素增加或减少时界面不会刷新
如下代码点击增加元素或减少元素,增加或减少嵌套在对象中的数组元素,界面不会有变化。
界面代码如下:
@Entry
@Component
struct Index {
@State dataList :TestDataList = new TestDataList([]);
aboutToAppear() {
this.dataList.datas = [new TestData('0',0),new TestData('1',1)];
}
build() {
Column(){
ForEach(this.dataList.datas,(data:TestData)=>{
Text(data.getName());
})
Button('增加元素').onClick((e)=>{
this.dataList.datas.push(new TestData(this.dataList.datas.length+'',this.dataList.datas.length));
}).width('100%')
Button('减少元素').onClick((e)=>{
this.dataList.datas.pop();
}).width('100%')
}.height('100%')
.alignItems(HorizontalAlign.Center)
.justifyContent(FlexAlign.Start)
}
}
数据类如下:
@Observed
export class TestData {
public value : number;
public name : string;
constructor(name: string, value: number) {
this.name = name;
this.value = value;
}
getValue():number{
return this.value + 100;
}
getName(): string {
return `name is: ${this.name} value is ${this.getValue()}`;
}
}
export class TestDataList {
public datas: Array<Object>
constructor(datas: Array<Object>) {
this.datas = datas;
}
}
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
如何处理json 涉及多次嵌套结构的动态数据
24浏览 • 0回复 待解决
scroll中嵌套一个或多个grid,如何实现嵌套滚动?
78浏览 • 0回复 待解决
PolarDB 的进程结构是什么?
793浏览 • 1回复 待解决
Mysql的索引是什么结构?
879浏览 • 1回复 待解决
WantAgentInfo中的wants为什么是数组
213浏览 • 1回复 待解决
PolarDB 的进程结构中Backend process是什么?
1009浏览 • 1回复 待解决
ScrollView嵌套ListContainer
4667浏览 • 5回复 待解决
物联网的层次结构中,网络层负责什么工作?
3082浏览 • 1回复 待解决
PolarDB 的数据块的结构是什么?
1016浏览 • 1回复 待解决
TiDB + Flink 结构中数据分析应用有什么特点?
1828浏览 • 1回复 待解决
状态装饰器 ui不刷新的问题
660浏览 • 1回复 待解决
PolarDB 数据库结构是什么?
1230浏览 • 1回复 待解决
能否嵌套定义 Record<string,Record>
43浏览 • 1回复 待解决
在Redis Cluster结构中对热Key进行复制的缺点是什么?
1315浏览 • 1回复 待解决
Grid嵌套滚动问题有知道的吗?
752浏览 • 1回复 待解决
自定义组件嵌套子组件
7336浏览 • 3回复 待解决
postgresql json 字段值为数组,怎么查询数组包含指定元素的数据?
12671浏览 • 1回复 待解决
ArkTS中声明变量时public的作用
360浏览 • 1回复 待解决
关于JS的垃圾回收机制,在数组中删除所有元素和直接把数组指向成空数组,哪个方式更好
207浏览 • 1回复 待解决
多层组件嵌套button,如何阻止事件传递
323浏览 • 1回复 待解决
鸿蒙js开发 树状结构组件
3753浏览 • 1回复 待解决
postgresql json 字段值为数组形式,怎么查询数组包含指定元素的数据?
3179浏览 • 1回复 待解决
DevEco Studio预览器中如何查看组件树结构
550浏览 • 1回复 待解决
通过$r访问应用资源是否支持嵌套形式
315浏览 • 1回复 待解决
鸿蒙scrollview 嵌套 webview 在滑动过程中遮挡 下面的组件
5485浏览 • 1回复 已解决
以上代码引起不刷新的问题主要是由于嵌套结构导致的:TestDataList这个类中嵌套存放了一个数组,数组中存放了一个类结构TestData。
由于@State装饰的变量,只能监听到对象本身的地址以及第一层属性的地址变化,也就是this.dataList地址的变化或者this.dataList.datas的地址变化,例如如下操作:
由于this.dataList.datas.push、pop的操作不会触发dataList以及datas的地址变化,也就不会触发UI的刷新。
解决方案是利用ArkUI提供的@Observed、@ObjectLink来对嵌套的结构建立UI与数据的联系,对于数组结构需要通过@Observed包装一层,使其成为可监听结构;
具体方案如下:
1. 将Array变为ObseredArray,使用Observed监听。
2. 替换原来的Array为ObseredArray。
3.视图中列表部分创建一个新的组件ListDataView,用ObjectLink接受数据。
4. 原来的Index引入ListDataView使用,并传递参数。