HarmonyOS 鸿蒙Next:Observed 一个 class,其中有个 数组,修改数组 UI 不变化

发布于 1周前 作者 zlyuanteng 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:Observed 一个 class,其中有个 数组,修改数组 UI 不变化

我是根据教程 MVVM 的例子,在写代码。https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-mvvm-V5#%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B

做到最后,把planList 拿了出去,创建了一个类。这个例子还是没问题的。

我自己,多加了一个按钮,在点击 Add 的时候,给 数组里继续 push 字符串,这时候 UI 就不变化了。

但是如果直接用 [@State](/user/State) planList: string[] = [...] 这样是OK的。

请教大家这个要怎么处理?才能让 Observed 和 State 生效。

[@Observed](/user/Observed)
export class TodoListData {
  public planList: string[] = [
    '7.30 起床',
    '8.30 早餐',
    '11.30 中餐',
    '17.30 晚餐',
    '21.30 夜宵',
    '22.30 洗澡',
    '1.30 起床'
  ];
}
 
[@State](/user/State) private data: TodoListData = new TodoListData()
....
List() {
        ForEach(this.data.planList, (item: string) => {
          ThingsComponent({ isFinished: this.isFinished, things: item }).margin({ top: 5 })
        })
      }
...
Button("Add")
          .margin({ top: 10 })
          .onClick(() => {
            if (this.newPlan) {
              this.data.planList.push(this.newPlan)
              this.newPlan = ''
            }
          })
 
4 回复

在 this.data.planList.push(this.newPlan) 后面增加一句话

this.data.planList=[...this.data.planList]

感谢回答,解决了。 想问下原因是? ArkTs 的 响应式,检测不到数组的 push 么? 有什么文档说明这个问题么?

@State 只能监听到一层数据的变化,你的代码中类中有数组,你去修改数组具体的数据,@State 是监听不到的,所以楼主的解决方式相当于 push 完后再把 push 后的数组重新赋值给类中的数组,相当于对第一层数据做了修改,这个时候 @State 就能监听到数据的变化了从而触发 UI 的更新了。

在HarmonyOS鸿蒙Next的开发环境中,如果你观察到修改数组后UI没有变化,这通常是由于数据绑定未正确更新或者数组本身的引用没有变化导致的。

  1. 确保使用可观察的数据结构:在HarmonyOS中,如果你希望UI能响应数据变化,应使用支持数据绑定的数据结构,如ObservableList或自定义的Observable对象。

  2. 数组引用变更:如果你直接修改了数组的内容(如通过索引赋值)而不是替换整个数组引用,UI可能不会刷新。尝试创建一个新的数组实例,并用新值填充,然后将其赋值给原来的数组变量。

  3. UI组件的数据绑定:检查你的UI组件是否正确绑定了数据。使用@Link注解或类似的机制确保UI组件能够响应数据变化。

  4. 通知机制:如果使用的是自定义的Observable对象,确保在数据变化时调用了相应的通知方法,如notifyPropertyChanged

  5. 调试与日志:增加日志输出,检查数据是否真的被修改,以及UI是否收到了更新通知。

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

回到顶部