HarmonyOS 鸿蒙Next List通过forEach渲染ListItem中的自定义组件,删除listItem的时候,页面不刷新
HarmonyOS 鸿蒙Next List通过forEach渲染ListItem中的自定义组件,删除listItem的时候,页面不刷新
import IndexApi from "…/…/…/…/api/index/index"
import { NoticeDetailVO } from "…/…/…/…/api/index/indexDataModel"
import { promptAction } from ‘@kit.ArkUI’;
import dayjs from ‘dayjs’
@Observed
class NoticeItem {
public id: number
public templateNickname: string
public templateContent: string
public createTime: number
public readStatus: boolean
constructor(id: number, templateNickname: string, templateContent: string, createTime: number, readStatus: boolean) {
this.id = id
this.templateNickname = templateNickname
this.templateContent = templateContent
this.createTime = createTime
this.readStatus = readStatus
}
}
@Entry
@Component
struct Notice {
@State noticeList: NoticeItem[] | [] = [] //初始化信息列表
//初始化
async aboutToAppear() {
this.noticeList = await IndexApi.getNoticeList()
}
async getNoticeList(id: number) {
console.log(‘sword–>thisFuncIsWork’, id)
setTimeout(async () => {
this.noticeList = await IndexApi.getNoticeList()
}, 1000)
}
build() {
Navigation() {
List() {
ForEach(this.noticeList, (item: NoticeItem) => {
ListItem() {
NoticeCard({ notice: item, click: this.getNoticeList })
.margin({
right: 15,
left: 15,
top: 10,
bottom: 10
})
}
}, (item: NoticeItem) => String(item.id))
}
.onReachEnd(() => {
console.log(‘sword–>滚动到底了!!’)
})
}
.title(‘消息通知’)
.titleMode(NavigationTitleMode.Mini)
.backgroundColor(’#f3f3f3’)
}
}
// 消息卡片
@Component
struct NoticeCard {
@ObjectLink notice: NoticeItem
click: (id: number) => void = () => {
console.log(‘sword–>this.click’)
}
async setMessageRead(id: number) {
try {
await IndexApi.setMessageRead(id)
this.click(id)
promptAction.showToast({
message: ‘设置成功’,
duration: 2000
})
} catch (e) {
}
}
build() {
Column() {
Row() {
Text(this.notice.templateNickname)
.fontColor(’#4a9ffb’)
Text(this.notice.readStatus ? ‘已读’ : ‘未读’)
.backgroundColor(’#ef6a6e’)
.fontSize(12)
.fontColor(’#fff’)
.borderRadius(5)
.padding({
top: 6,
bottom: 6,
left: 8,
right: 8
})
}
.width(‘100%’)
.alignItems(VerticalAlign.Center)
.justifyContent(FlexAlign.SpaceBetween)
Text(this.notice.templateContent)
.width(‘100%’)
.margin({
top: 12,
bottom: 12
})
Row() {
Button(‘设置已读’).onClick((event: ClickEvent) => {
this.setMessageRead(this.notice.id)
})
.height(25)
.fontSize(14)
Text(dayjs(this.notice.createTime).format(‘YYYY-MM-DD HH:mm:ss’))
}
.width(‘100%’)
.justifyContent(FlexAlign.SpaceBetween)
}
.backgroundColor(’#fff’)
.borderRadius(5)
.padding({
top: 8,
bottom: 8,
left: 10,
right: 10
})
}
}
如果将自定义组件替换 删除功能正常
更多关于HarmonyOS 鸿蒙Next List通过forEach渲染ListItem中的自定义组件,删除listItem的时候,页面不刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
应该是这个NoticeCard({ notice: item, click: this.getNoticeList })中this指向的问题,this指向的是子组件导致父组件中的this.noticeList对象未正确赋值,把
NoticeCard({ notice: item, click: this.getNoticeList })
改成
NoticeCard({ notice: item, click:(): Promise<void> => this.getNoticeList(item.id) })试试,通过箭头函数传递父组件的this,楼主可以在getNoticeList这个方法中打个断点看下this的指向
更多关于HarmonyOS 鸿蒙Next List通过forEach渲染ListItem中的自定义组件,删除listItem的时候,页面不刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
是this指向的问题
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html
NoticeCard({ notice: item, click: this.getNoticeList })
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
改成
NoticeCard({ notice: item, click: ():Promise<void> => this.getNoticeList(item.id) })
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
就行,this指针传进去还是子组件的this,所有要改成父组件的this才能真正刷新父组件的this.noticeList
在HarmonyOS鸿蒙系统中,若使用Next List通过forEach
渲染ListItem
中的自定义组件,并在删除listItem
时遇到页面不刷新的问题,通常是由于数据绑定未正确更新导致。以下是可能的解决方案:
-
确保数据源的更新:在删除
listItem
后,必须确保存储listItem
的数据源(如列表或数组)已正确更新。这通常涉及从数据源中移除对应项。 -
使用
@ObservedObject
或@State
:如果数据源是一个对象或状态,确保使用@ObservedObject
或@State
进行包裹,以便鸿蒙系统能够检测到其变化并自动刷新UI。 -
检查组件的重新渲染:确保自定义组件能够响应父组件的数据变化。如果自定义组件内部有缓存逻辑,可能需要手动刷新或重置。
-
调用
refresh
方法:在某些情况下,可能需要手动调用列表或容器的refresh
方法,以强制刷新视图。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。