HarmonyOS 鸿蒙Next数组对象更新如何刷新UI

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

HarmonyOS 鸿蒙Next数组对象更新如何刷新UI

@Observed
class Article {
id: string;
title: string;
brief: string;
isLiked: boolean;
likesCount: number;

constructor(id: string, title: string, brief: string, isLiked: boolean, likesCount: number) {
this.id = id;
this.title = title;
this.brief = brief;
this.isLiked = isLiked;
this.likesCount = likesCount;
}
}

const articleList: Array<Article> = [
new Article(‘001’, ‘第0篇文章’, ‘文章简介内容’, false, 100),
new Article(‘002’, ‘第1篇文章’, ‘文章简介内容’, false, 100),
new Article(‘003’, ‘第2篇文章’, ‘文章简介内容’, false, 100),
new Article(‘004’, ‘第4篇文章’, ‘文章简介内容’, false, 100),
new Article(‘005’, ‘第5篇文章’, ‘文章简介内容’, false, 100),
new Article(‘006’, ‘第6篇文章’, ‘文章简介内容’, false, 100),
]
AppStorage.setOrCreate(‘PropA’, articleList)

@Entry
@Component
struct ArticleListView {
@StorageProp(‘PropA’) articleList: Array<Article> = [];

build() {
List() {
ForEach(this.articleList, (item: Article) => {
ListItem() {
ArticleCard({
article: item
})
.margin({ top: 20 })
}
.onClick(() => {
const list: Article[] = []
this.articleList.forEach((item2) => {
if (item2.id === item.id) {
const item3 = new Article(‘001’, ‘第0篇文章’, ‘文章简介内容’, false, item.likesCount + 1)
list.unshift(item3)
}
list.push(item2)
})
AppStorage.setOrCreate(‘PropA’, list)
console.log(’//////’+list.length,JSON.stringify(list))
})
}, (item: Article) => item.id)
}
.padding(20)
.scrollBar(BarState.Off)
.backgroundColor(0xF1F3F5)
}
}

@Component
struct ArticleCard {
@ObjectLink article: Article;

// handleLiked() {
// this.article.isLiked = !this.article.isLiked;
// this.article.likesCount = this.article.isLiked ? this.article.likesCount + 1 : this.article.likesCount - 1;
// }

build() {
Row() {
Column() {
Text(this.article.title)
.fontSize(20)
.margin({ bottom: 8 })
Text(this.article.brief)
.fontSize(16)
.fontColor(Color.Gray)
.margin({ bottom: 8 })
Row() {
Text(this.article.likesCount.toString())
.fontSize(16)
}
.justifyContent(FlexAlign.Center)
}
.alignItems(HorizontalAlign.Start)
.width(‘80%’)
.height(‘100%’)
}
.padding(20)
.borderRadius(12)
.backgroundColor(’#FFECECEC’)
.height(120)
.width(‘100%’)
.justifyContent(FlexAlign.SpaceBetween)

// .onClick(() => this.handleLiked())
}
}

6 回复
你代码 const item3 = new Article('001', '第0篇文章', '文章简介内容', false, item.likesCount + 1)这里的id不能articleList中已经有的id重复,因为ForEach加了(item: Article) => item.id)键值生成函数,重复id会导致List(){}渲染有问题,改成const item3 = new Article('00'+this.articleList.length+1, '第0篇文章', '文章简介内容', false, item.likesCount + 1)或者去掉(item: Article) => item.id)就可以了

我需要的就是在别出文件更新原数据,但是官方推荐添加key: 1、去掉key能更新UI; 2、添加key,直接item.likesCount += 1,也能更新UI,因为监测的是单层对象 3、在其他文件更新数组对象,此时有key就不能更新UI

我实测下来的话@StorageLink 可以在数组对象或嵌套对象变动时更新UI,@StorageProp只能对普通对象生效,要么你就改用@StorageLink,使用起来也方便

官方不推荐不设置key,官方不推荐使用@StorageLink,但是真的好用,就不考虑性能问题,能跑就行

针对HarmonyOS 鸿蒙Next数组对象更新如何刷新UI的问题,以下是一些专业解答:

在HarmonyOS中,当数组对象更新时,UI不刷新通常是因为数据绑定机制只监听了数组的地址值,而未监听数组内部对象属性的变化。为了解决这个问题,可以采取以下几种方法:

  1. 使用临时数组:先复制一个临时数组,修改临时数组中的对象属性,然后将临时数组重新赋值给原数组。这样可以触发数组地址值的改变,从而刷新UI。
  2. 利用map方法:通过map方法遍历数组并返回一个新数组,即使数组中的对象属性没有改变,但由于返回了一个新数组,也可以触发UI的刷新。
  3. 利用@Observed@ObjectLink装饰器:对于复杂的数据结构,如对象数组,可以使用@Observed装饰器来标记数据类,并使用@ObjectLink装饰器在UI组件中绑定数据。这样,当数据变化时,UI会自动刷新。

如果以上方法均未能解决问题,可能是由于更复杂的系统或应用逻辑导致。此时,建议深入检查代码逻辑,或参考HarmonyOS官方文档和示例代码。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部