HarmonyOS 鸿蒙Next ets声明式UI开发,@state装饰带数组的class变量时异常情况

HarmonyOS 鸿蒙Next ets声明式UI开发,@state装饰带数组的class变量时异常情况

[@state](/user/state)装饰带数组的class变量,当修改变量里的数组时,ui界面不会刷新

完整测试代码如下:

```javascript
export class test_class{
  data1: number
  data2: number[]
  constructor(data1: number,data2: number[]) {
    this.data1 = data1
    this.data2 = data2
  }
}
[@Entry](/user/Entry)
[@Componentstruct](/user/Componentstruct) Index {
  [@State](/user/State)
  var_a : test_class = new test_class(10,[0,1])
  private id : number = 5
  build() {
    Column({ space:10 }){
    Row({space:20}) {
      Button('Data1 add')
        .fontSize(20).backdropBlur(0x317aff)
        .margin({ right: 20, left: 20 })
        .onClick((event: ClickEvent) => {
          this.var_a.data1 ++
        })
      Button('New Data2')
        .fontSize(20).backdropBlur(0x317aff)
        .margin({ right: 20, left: 20 })
        .onClick((event: ClickEvent) => {
          this.var_a.data2.push(this.id)
          this.id++
        })
    }.width('100%').height(60)
      Text('data1 is : '+this.var_a.data1.toString())
        .fontSize(25).backgroundColor(Color.Gray)
      Text('data2 :')
        .fontSize(25).backgroundColor(Color.Gray)
      Column({space:5}) {
        if(this.var_a.data2.length != 0) {
          ForEach(this.var_a.data2, (item: number) => {
            Text(item.toString()).fontSize(25)
          }, (item: number) => item.toString())
        }
      }
    }.width('100%').height('100%')
  }
}

测试过程如下:

点击New Data2,界面不刷新,算不算bug ?


更多关于HarmonyOS 鸿蒙Next ets声明式UI开发,@state装饰带数组的class变量时异常情况的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

楼主你好,需要对数组进行重新赋值,具体可以参考:

Button('New Data2')
  .fontSize(20).backdropBlur(0x317aff)
  .margin({ right: 20, left: 20 })
  .onClick((event: ClickEvent) => {
    let temp = new Array();
    this.var_a.data2.push(this.id)
    for (var i = 0; i < this.var_a.data2.length; i++) {
      temp.push(this.var_a.data2[i])
    }
    this.var_a.data2 = temp
    this.id++
  })

更多关于HarmonyOS 鸿蒙Next ets声明式UI开发,@state装饰带数组的class变量时异常情况的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这样处理可以达到实时刷新效果,但这样会增加cpu工作量,在复杂情况下可能不太适用(导致应用反应变慢),例如:数组比较大时;数据需高频刷新时(例如拖拽平移等),例如:

楼主你好,这个问题已经反馈给研发,请您耐心等待一下。

楼主你好,研发人员说按这个方法处理,感谢反馈。

楼主 有没有找到更好的办法  感觉这个方法实在是有损性能  不是很有的解决办法

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

欢迎开发小伙伴们进来帮帮楼主

在HarmonyOS鸿蒙Next的ets声明式UI开发中,当使用@state装饰带数组的class变量时遇到异常情况,通常可能是由以下几个原因导致的:

  1. 数组类型不匹配:确保数组中的元素类型与声明的类型完全一致。例如,如果声明为@state array: Array<number>,则数组中的所有元素都应为数字类型。

  2. 数组初始化问题:检查数组是否在使用前已正确初始化。未初始化的数组可能导致运行时错误。

  3. 数组操作不当:在修改数组时,确保没有违反数组操作的规则,如越界访问、类型不匹配地赋值等。

  4. 状态更新机制:在ets中,使用@state装饰的变量在更新时会自动触发UI刷新。如果数组更新操作未正确触发这一机制,可能导致UI不同步。确保在修改数组后,相关的状态更新被正确触发。

  5. 内存管理问题:虽然ets框架通常会自动管理内存,但在复杂的数据操作中,仍需注意避免内存泄漏或无效引用。

如果上述检查后问题依旧没法解决,请联系官网客服。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部