HarmonyOS鸿蒙Next中为什么对array设置state标签为何没效果呢?

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

HarmonyOS鸿蒙Next中为什么对array设置state标签为何没效果呢?

@State objArr: Array<userAndCampModel> = [];

可以这样使用吗? 为什么修改objarr里面的数据 没变化呢?

9 回复

这里push完要重新给objarr赋值,可以试试

更多关于HarmonyOS鸿蒙Next中为什么对array设置state标签为何没效果呢?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


通过

import { campModel } from '../model/campModel'
import { userModel } from '../model/userModel'

export default class userAndCampModel {
  public c:campModel = null!;
  public u:userModel = null!;
}

@ObservedV2

export class campTest {
  @Trace commNum: Array<number> = [];
  @Trace btnCollectImg:Array<Resource> = [];
}
tCamp.campListByProvince(params, (data: Array<userAndCampModel>) => {
  this.Gridcolumns = '1fr 1fr';
  if(data) {
    if (data.length == 0) {
      this.dataIsEnd = true;
    }
  }
  let n = 0;
  data.forEach(
    (item) => {
      this.campTest2.commNum[n] = item.c.commentNum;
      this.campTest2.btnCollectImg[n] = $rawfile('ich_collect_n_24x24.png');
      this.objArr.push(item);
      n++;
    }
  )
})

观察嵌套类对象属性变化,使用@Observed装饰器和@ObjectLink装饰器,参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-observed-and-objectlink-V5

ObjectLink 不能在 @Entry 里面使用 这怎么办?

因为@State只能检测到浅层属性改变。可以通过重新赋值或者使用@ObjectLink@Observed装饰所需要的那层属性,即可深层监听。

ObjectLink 不能在 @Entry 里面使用 这怎么办?

在HarmonyOS鸿蒙Next中,@State标签用于标记组件的状态变量,当状态变量发生变化时,UI会自动更新。如果你对数组设置了@State标签但没有效果,可能是以下原因:

  1. 数组引用未改变:@State只监听引用变化,如果数组内容改变但引用未变,UI不会更新。你需要创建一个新数组并重新赋值。

  2. 数组元素类型不支持:@State对某些复杂类型(如对象数组)的监听可能不如基本类型数组那样直接。确保数组元素类型是基本类型或支持状态管理的数据类型。

  3. 状态未在UI中使用:@State只在UI中绑定的状态变化时触发更新。如果数组未在UI中使用,状态变化不会触发UI更新。

  4. 组件未正确使用:确保使用@State的组件是支持状态管理的组件,如@Component@Entry

  5. 框架版本问题:某些版本的HarmonyOS可能存在@State对数组支持的bug或限制,建议确认框架版本是否支持该功能。

总结:@State对数组的支持依赖于引用变化和UI绑定,确保数组引用改变并在UI中使用,才能触发更新。

在HarmonyOS鸿蒙Next中,state标签用于标记组件的状态,以便在状态变化时触发UI更新。如果对array设置state标签没有效果,可能是因为array本身是引用类型,直接修改其内容不会触发状态更新。建议使用@State装饰器来管理数组状态,并通过this.array = [...this.array]等方式创建新数组来触发更新。确保遵循响应式编程的最佳实践。

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