HarmonyOS 鸿蒙Next 用@State修饰的数组,一维的每一个元素都能触发重绘,二维的不行。求解!
@Entry
@Component
struct Page34 {
@State dArray: boolean[][]= [[false, false], [false, false]]
build() {
Column() {
ForEach(this.dArray,(item:[],index:number)=>{
ForEach(item,(item_2:boolean,index_2:number)=>{
Button('第'+index+'组,第'+index_2+'个,value:'+item_2)
.onClick(()=>{
this.dArray[index][index_2] = !item_2//修改数据
// 让数组元素地址变更,从而触发重绘
this.dArray[index] = [... this.dArray[index]]//方案一:拷贝数组
// this.dArray[index] = JSON.parse(JSON.stringify(item))//方案二:序列化后再反序列化。
//方案三:@Observed+@ObjectLink 参考官方文档
})
})
})
}
.width('100%')
}
}
更多关于HarmonyOS 鸿蒙Next 用@State修饰的数组,一维的每一个元素都能触发重绘,二维的不行。求解!的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
希望HarmonyOS能继续加强在安全性方面的研发,保护用户的隐私和数据安全。
系统为什么要这样设计?
目前就是这样,其内的技术因素那你得问华为 IDE 和 ArkTS 设计团队了。
方案四:把二维数组转化成一维数组处理。二维数组[m by n],dArray[i][j]就是sArray[i*m+j]。可以处理更高维。
在HarmonyOS鸿蒙Next中,@State
装饰器用于管理组件的状态,当状态发生变化时,会触发组件的重绘。对于一维数组,@State
能够正确识别每个元素的变化,并触发相应的重绘。然而,对于二维数组,@State
可能无法直接识别内部数组元素的变化,导致重绘不触发。
这是因为@State
装饰器在检测状态变化时,主要依赖于引用比较。对于一维数组,每个元素的改变会直接导致数组引用的变化,从而触发重绘。但对于二维数组,内部数组元素的变化可能不会导致外层数组引用的变化,因此@State
无法检测到变化,也就不会触发重绘。
要解决这个问题,可以考虑将二维数组拆分为多个一维数组,或者使用@Observed
和@ObjectLink
装饰器来管理二维数组的状态。@Observed
用于标记一个类为可观察的,@ObjectLink
用于在组件中引用可观察对象,这样当二维数组内部元素发生变化时,能够正确触发重绘。
在鸿蒙Next中,@State
修饰的一维数组可以触发重绘,而二维数组则不能,这是因为@State
的机制默认只监听数组的第一层变化。对于二维数组,内部数组的变化不会触发外层数组的监听。解决方案是使用@Observed
和@ObjectLink
来深度监听二维数组的变化,或者手动调用this.setState()
强制触发重绘。