HarmonyOS鸿蒙Next中为什么给ArrayList类型的数组添加数据后,数据不会被刷新
HarmonyOS鸿蒙Next中为什么给ArrayList类型的数组添加数据后,数据不会被刷新
为什么给ArrayList类型的textArrayList添加数据,textArrayList的数据不会被刷新
点击按钮给textArrayList添加数据,点击次数会刷新,添加给textArrayList数据不会被添加,textArrayList的lenght也没有变化。
具体代码如下:
import { ArrayList } from '@kit.ArkTS';
@Component
struct Index {
@State textArrayList: ArrayList<string> = new ArrayList();
@State number: number = 0;
build() {
Column(){
Column(){
Button('OK', { type: ButtonType.Capsule, stateEffect: true })
.backgroundColor(0x317aff)
.width(90)
.onClick(() =>{
this.number += 1
this.textArrayList.add("测试添加")
})
}
Column(){
Text("当前点击"+ this.number +"次").fontSize(30)
Text("当前ArrayList中有"+ this.textArrayList.length +"条").fontSize(30)
}
Column(){
List(){
ListItem(){
Text("测试").fontSize(30)
}
ForEach(this.textArrayList.convertToArray(),(name: string)=>{
ListItem(){
Text(name).fontSize(30)
}
}, (name: string) => name.toString())
}
}.backgroundColor("red")
}.height('100%')
.width('100%').justifyContent(FlexAlign.Center)
}
}
更多关于HarmonyOS鸿蒙Next中为什么给ArrayList类型的数组添加数据后,数据不会被刷新的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这样实际监听的是 textArrayList
这个对象本身的地址变化,而元素增加并不会改变它的地址。
可以拷贝一个,再赋值,这样地址变了,就能触发响应刷新。
更多关于HarmonyOS鸿蒙Next中为什么给ArrayList类型的数组添加数据后,数据不会被刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
按您说的确实能刷新,但是点击多次添加数据,foreach
渲染组件只会渲染增加一个。这是怎么回事呢。
ForEach 中的第三个参数 key 要唯一,不要使用重复的,你可以把 index + name 作为 key 试试,
在HarmonyOS Next中,ArrayList类型的数据更新不会自动触发UI刷新,这是因为ArkTS框架无法直接监听ArrayList内部的变化。要解决这个问题,有以下两种方案:
- 最简单的方式是改用普通数组(Array)替代ArrayList,因为@State装饰器能直接监听数组变化:
[@State](/user/State) textArray: Array<string> = [];
// 添加数据时
this.textArray.push("测试添加");
- 如果必须使用ArrayList,需要手动触发更新:
// 添加数据后重新赋值整个ArrayList
let temp = this.textArrayList.convertToArray();
temp.push("测试添加");
this.textArrayList = new ArrayList(temp);
问题出在ForEach渲染时使用了convertToArray(),这会导致每次渲染都是基于快照数据。建议直接使用普通数组可以获得更好的响应式体验。