HarmonyOS 鸿蒙Next 关于Arkts代码的问题求助

HarmonyOS 鸿蒙Next 关于Arkts代码的问题求助 我有一个这样的数组

@State list:Array<any>=[
  {    
    shixiang:"考试",
    day:"2023-09-25"
  },
  {
    shixiang:"英语考试",
    day:"2023-09-19"
  }
];

然后通过循环渲染,去创建自定义组件

ForEach(this.list,(item,idx)=>{
  _Card({
    info:item,
  })
})

我现在希望点击按钮,改变list中第一个元素的shixiang字段的值,然后在自定义组件里同步渲染

我代码原本是这么写的:

let list = this.list;
list[0].shixiang = "a";
this.list = list;
console.log("applog:"+JSON.stringify(this.list))

然后通过console.log打印出来发现,list的值的确被改变了,但是自定义组件那里没有被渲染

然后换了种写法

this.list = [
  {
    shixiang:"考试3",
    day:"2023-09-25"
  },
  {
    shixiang:"英语考试2",
    day:"2023-09-19"
  }
]
console.log("applog:"+JSON.stringify(this.list))

这样写,不仅打印出来的能改变,而且自定义组件里的值也改变了

我的问题是,既然打印出来的值都变了,为什么第一种写法组件里的不变,第二种就变了呢?


更多关于HarmonyOS 鸿蒙Next 关于Arkts代码的问题求助的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

使用array<>的时候,<>这个结构是一个完整的数据类型,里面的具体参数只是这个数据类型的一个属性,@state的原理只能检测<>指向的变量有没有发生变化,无法查询到变量具体的属性变化。

更多关于HarmonyOS 鸿蒙Next 关于Arkts代码的问题求助的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


明白了,所以我第二种可行的写法,说白了就是把<>指向的变量直接替换掉了,当然发生了变化,所以才有效,

大佬,

我推测是let list 本身就是 @State list:Array<any>, 你再把 let list 给 @State list:Array<any> 那就是没变化 

我是先let list拿到@State list,然后对list做了修改,再赋值的,而且通过打印this.list,也发生了变化的,

HarmonyOS的ArkTS是一种基于TypeScript的编程语言,主要用于开发鸿蒙应用的UI组件和逻辑。ArkTS结合了TypeScript的静态类型检查和HarmonyOS的UI框架,提供了更高效的开发体验。在处理ArkTS代码时,开发者通常会遇到UI组件定义、状态管理、事件处理等问题。例如,使用@Component装饰器定义自定义组件,@State@Link用于管理组件状态,@Prop用于父子组件之间的数据传递。事件处理则通过@Watch监听状态变化或直接绑定事件处理函数。ArkTS还支持模块化开发,允许开发者将代码拆分为多个模块以提高可维护性。在调试ArkTS代码时,可以使用鸿蒙DevEco Studio提供的工具进行实时预览和调试。

回到顶部