HarmonyOS 鸿蒙Next 列表子元素变化,ui不渲染变化

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

HarmonyOS 鸿蒙Next 列表子元素变化,ui不渲染变化

@Observed
class FansModel {
userId: string;
nickName: string;
avatar: string;
following: number;

constructor(userId: string, nickName: string, avatar: string, following: number) {
this.userId = userId;
this.nickName = nickName
this.avatar = avatar
this.following = following
}
}


@Entry
@Component
struct Fans {
@State hasFollow: boolean = false
@State currentPage: number = 1
@State pageSize: number = 20
@State fansList: FansModel[] = [
new FansModel(‘123’,‘chongxin’,‘123123’,1)
]

build() {
Column() {
DetailNavigationTitle({ title: ‘粉丝’ })
List() {
ForEach(this.fansList, (item: FansModel) => {
ListItem() {
listView({ fans: item})
}
}, (item: FansModel) => item.userId)
}
// .onAppear(()=>{
// this.loadData()
// })
}
}

aboutToAppear() {
this.loadData()
// this.fansList.push(new FansModel(‘456’,‘123’,‘123123’,1))
}

loadData() {
const data: BasePaginationRequest = {
currentPage: 1,
pageSize: this.pageSize
}
fansViewModel.queryFansList(data, (result) => {
console.log(‘result,’, JsonUtils.stringify(result.content))
this.fansList.push(…result.content)
console.log(‘fansList,’, JsonUtils.stringify(this.fansList))
})
}
}

@Component
struct listView {
@ObjectLink fans: FansModel;

follow(){
console.log(‘item.following:’, this.fans.following)
if (this.fans.following === 1) {
this.fans.following = 2
} else {
this.fans.following = 1
}

console.log(‘fans:’, JsonUtils.stringify(this.fans))
}

build() {
Row() {
UserAvatar({ avatarWidth: 50, avatarHeight: 50, avatarImage: this.fans.avatar })
Text(this.fans.nickName)
.fontSize(18)
.fontWeight(FontWeight.Bold)
.fontColor(Color.Black)
.margin({ left: 10 })
Blank()
Button({ type: ButtonType.Normal, stateEffect: true }) {
Text(this.fans.following === 1 ? ‘取消关注’ : ‘关 注’)
.fontColor(this.fans.following == 1 ? Color.White : Color.Black)
.fontWeight(FontWeight.Bold)
.fontSize(14)
}
.width(80)
.height(25)
.borderRadius(20)
.backgroundColor(Color.Red)
.onClick(() => {
this.follow()
// this.s = !this.s
})
}
.width(‘100%’)
.padding(15)

}
}

这里列表从接口获取数据后,this.fansList有值后,修改子元素状态,ui不会渲染变化,this.fans.following 发生变化不会被渲染,这是啥问题?如果fansList是不通过接口获取数据,反而子元素变化,ui会渲染

4 回复
FansModel从接口获取的话是一个plain objects对象,本质上没被[@Observed](/user/Observed)修饰,需要使用class-transformer进行转换

不渲染?这个代码

cke_473.png

朋友,这个问题解决了吗?

HarmonyOS 鸿蒙Next中列表子元素变化而UI不渲染的问题,通常是由于@State只监听数组的地址值变化,而不直接监听数组中对象属性的变化。当数组中的对象属性发生变化时,由于数组的地址值未变,因此UI不会自动刷新。

针对这一问题,可以采取以下解决方案:

  1. 创建一个临时数组,将需要修改的子元素在临时数组中进行修改,然后将临时数组重新赋值给原数组。这样,由于数组地址值发生了变化,UI会重新渲染。
  2. 直接修改数组中的对象属性后,使用map方法遍历数组并返回一个新数组。虽然数组内容可能未变,但由于返回的是一个新数组,其地址值已改变,同样可以触发UI的重新渲染。

这两种方法都能有效地解决HarmonyOS 鸿蒙Next中列表子元素变化而UI不渲染的问题。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部