HarmonyOS 鸿蒙Next @Link的值变了,视图没有更新

HarmonyOS 鸿蒙Next @Link的值变了,视图没有更新 没有重新渲染这个组件

这里是重新给数组赋值的代码

父组件传递的值

子组件的定义

27 回复

可以了,看我标记的代码

cke_902.png

更多关于HarmonyOS 鸿蒙Next @Link的值变了,视图没有更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


太神奇了,居然是ForEach的后面的keyGenerator去掉就可以了,这个不是用来增加循环效率的哇,加了数组修改居然受到了影响。

楼主,我也遇到了这个问题,最后的结论是什么?修改item中属性,可以刷新List吗?

new1
new2

🙂这样处理了下,

把id作为主键,只有修改id才会触发.

好的,明白了,

基本信息
姓名:张三
职位:软件工程师
技能:Java, Python, C++

工作经验
2018-2020: 软件开发实习生
公司:ABC科技有限公司
职责:参与项目需求分析,编写代码,进行单元测试。

2020-至今: 软件工程师
公司:XYZ科技有限公司
职责:负责项目整体架构设计,代码审核,团队技术培训。

@State - @Link, 对于数组类型的数据,只能观测到数组的增加、删除、数组单元重新赋值,观察不到数组元素Class的属性的变化。

我选建立一个临时的数组,再重新赋值按道理是可以呀

let tempList: Array<Todo> = this.todoItem.copyWithin(0, this.todoItem.length);
tempList.forEach((todo: Todo, index) => {
   if (todo.id === item.id) {
      tempList[index].status = !item.status;
      this.todoItem = tempList;
   }
});

而且值也变了,视图没有更新,

我总结一下,我换了一个思路,由父组件来循环下去,具体代码就是下面这样

cke_3828.png

cke_4150.png

cke_4512.png

其实这种才是正常的方法,list在父组件把item传递给子组件,然后子组件进行渲染。

但是我昨天看你的代码,感觉应该是没问题的。

https://gitee.com/kai-chen/learn-ark-ui.gith

±/$%-+看这个StatPassPage页面,

显示有问题

图片

开放报名的课程

已选择的课程:


Java,C#,Arkts

cke_129.png

这样就好了

我怎么不行呐,

基本信息

  • 姓名: 张三
  • 年龄: 28
  • 职位: 开发者

技能

  • Python
  • Java
  • C++

我用了你说的拷贝对象,还是没有改变值,

那要看下你改后的代码了,

那要看下你改后的代码了,

刚才简单用你的方式试了下,是可以的

可以在父组件打个日志看下数据是否更新

添加值是可以的,修改不行,最开始我也这样测试过。

我图一下面的log就是变成ture了,已选择也更新了的,

我又测试了下,应该是赋值的问题,其实用的都是同一个地址。所以你在操作完之后又赋值回去还是那个对象,所以他不会重新刷新。这种应该要重新新建一个对象或者拷贝一个。

你的todoItem是咋定义的,我记得要用 @State 定义的,界面才会重新渲染。或者是不是不支持对象里属性变化。

@Link todoItem:Todo[];这个是子组件的,然后父组件 @State todoItem:Array<Todo> = [];TodoList({ todoItem: $todoItem });

但是在父组件的已选择的课程都更新了,子组件没有视图就没有更新,

你这个看着应该是没问题的,我差不多也这样用,不过我没套在对象里。

在HarmonyOS中,@Link用于父子组件之间的双向数据绑定。如果@Link的值发生了变化,但视图没有更新,可能是以下原因之一:

  1. 数据源未正确更新:@Link绑定的是父组件传递给子组件的数据。如果父组件中的数据源没有正确更新,子组件的视图也不会更新。

  2. 状态管理问题:如果使用了@State@Provide等状态管理装饰器,确保这些状态变量的更新能够正确触发视图的重新渲染。

  3. 组件生命周期:检查组件的生命周期方法,确保在数据变化时触发了组件的重新渲染。

  4. 数据绑定问题:确保@Link绑定的数据是响应式的,并且在数据变化时能够正确通知到子组件。

  5. UI更新机制:鸿蒙的UI更新机制可能在某些情况下不会自动触发,可能需要手动调用this.update()来强制更新视图。

  6. 异步操作:如果数据变化发生在异步操作中,确保异步操作完成后能够正确触发视图更新。

  7. 组件层级问题:检查组件层级和父子关系,确保@Link绑定的数据能够正确传递到子组件。

  8. 框架版本问题:某些鸿蒙框架版本可能存在@Link绑定的Bug,建议检查并确认使用的是最新稳定版本。

如果以上问题都排除了,仍然无法解决,可以考虑使用@Watch装饰器来监听@Link的变化并手动触发视图更新。

回到顶部