HarmonyOS 状态变量更新及其@watch监听问题

瀑布流WaterFlow里面通过LazyForEach循环显示子组件,数据源继承IDataSource定义为WaterFlowDataSource,里面定义一个dataArray数组:

LazyForEach(this.waterFlowDataSource, (item: XXXModel, index: number) => {
  sonItem({ item: item })
}, index => index.toString())
sonItem({ item: item }

里面有个变量item,接收循环里面的model对象,sonItem里面这个item改用哪种状态修饰器进行修饰,才能保证外面数据源发生改变,例如页面下拉刷新,WaterFlowDataSource数据源数据被替换,触发了瀑布流的刷新操作,这个时候sonItem里面的item不管用@state @prop、@obserLink都不会发生改变,要求sonItem里面item能发生改变,并且item的@watch能触发监听回调,因为回调里面还需要对数据做处理,实现一些方法等操作。

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

参考示例如下:

Button('更换数据源').onClick(() => {
  //注释的方式是之前的替换数据源方式,会存在上述的问题,ui不会刷新
  // this.materialsDataSource.filterDataItems = this.materialsDataSource2.filterDataItems
  //使用如下方式替代,不直接替换整个数据源,而是替换item中的属性,然后用@ObjectLink和@Observed来监听item
  for(let i = 0; i<this.materialsDataSource.filterDataItems.length;i++){
    this.materialsDataSource.filterDataItems[i].material = this.materialsDataSource2.filterDataItems[i].material
    this.materialsDataSource.filterDataItems[i].download_progress = this.materialsDataSource2.filterDataItems[i].download_progress
    this.materialsDataSource.filterDataItems[i].download_state = this.materialsDataSource2.filterDataItems[i].download_state
  }
  this.materialsDataSource.notifyDataReload()
})

lazyforeach和状态管理的是两套机制,上面说的那些情况要调用Lazyforeach的ondatereload的接口触发数据刷新,状态管理观察不到。两套刷新机制可以调lazyforeach的接口刷新或者借助状态变量刷新。

分享
微博
QQ
微信
回复
1天前
相关问题
ArkTS中如何监听状态变量的变化?
1032浏览 • 1回复 待解决
HarmonyOS 状态变量不刷新问题
516浏览 • 1回复 待解决
HarmonyOS constraintSize支持状态变量
0浏览 • 0回复 待解决
状态变量和常规变量有什么区别?
495浏览 • 2回复 待解决
关于状态变量@state必须知道的事
1202浏览 • 1回复 待解决
HarmonyOS 关于@Watch监听状态问题
520浏览 • 1回复 待解决