HarmonyOS 鸿蒙Next 用@State修饰的数组,一维的每一个元素都能触发重绘,二维的不行。求解!

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 用@State修饰的数组,一维的每一个元素都能触发重绘,二维的不行。求解!

@State sArray: boolean[] = [false, false, false, false]

sArray中任一元素sArray[i]发生变化,都能触发重绘。

@State dArray: boolean[][]= [[false, false], [false, false]]

dArray中任一元素dArray[i][j]发生变化,都不能触发重绘。

8 回复
@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()强制触发重绘。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!