HarmonyOS 鸿蒙Next list组件在数据不更新的情况下如何重新渲染
HarmonyOS 鸿蒙Next list组件在数据不更新的情况下如何重新渲染
interface listType{
title: number;
titlename?:string
}
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
@State messageSource: listType[] = [{title:1731053367168}]
@State isRefreshing: boolean = false;
static timeAgo(time:number): string {
if (!time || time == 0) return "";
const dateobj = new Date(time)
const year = dateobj.getFullYear()
const month = (dateobj.getMonth() + 1).toString().padStart(2, '0')
const date = dateobj.getDate().toString().padStart(2, '0')
const hours = dateobj.getHours().toString().padStart(2, '0')
const minutes = dateobj.getMinutes().toString().padStart(2, '0')
const today = new Date()
if (today.getTime() - time <= 1000*60) {
return '刚刚'
}
if (today.getTime() - time < 1000*60*60) {
return Math.floor(((today.getTime() - time) / 1000 / 60)) + "分钟前"
}
// xx:xx
if (today.getTime() - time < 1000*60*60*24 && today.getDate() === dateobj.getDate()) {
return hours+":"+minutes
}
// 昨天xx:xx
if (today.getTime() - time < 1000*60*60*48 && (
today.getDate() === 1?
new Date(today.getFullYear(), today.getMonth(), 0).getDate() === dateobj.getDate() : // 判断是不是最后一天
today.getDate() - dateobj.getDate() === 1)) // 判断日期相差1
{
return '昨天'+hours+":"+minutes
}
// xx月xx日
if (today.getFullYear() === dateobj.getFullYear()) {
return month+"月"+date+"日"
}
return year+"年"+month+"月"+date+"日"
};
build() {
RelativeContainer() {
Refresh({ refreshing: $$this.isRefreshing }) {
List() {
ForEach(this.messageSource, (item: listType, index: number) => {
ListItem() {
Row({ space: 10 }) {
Text('title')
Text(Index.timeAgo(item.title))
}
.width('100%')
.height(40)
.padding({ left: 10, right: 10 })
}
})
}
}
.onRefreshing(() => {
this.isRefreshing=false
})
.pullToRefresh(true)
Button('点击刷新').onClick((event: ClickEvent) => {
}).margin({top:100})
}
.height('100%')
.width('100%')
}
}
2 回复
看下加了一个update标识。你看是否能满足
interface listType{
title: number;
titlename?:string
}
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
[@State](/user/State) message: string = 'Hello World';
[@State](/user/State) messageSource: listType[] = [{title:1731053367168}]
[@State](/user/State) update:number= 0
[@State](/user/State) isRefreshing: boolean = false;
static timeAgo(time:number,update:number): string {
if (!time || time == 0) return "";
const dateobj = new Date(time)
const year = dateobj.getFullYear()
const month = (dateobj.getMonth() + 1).toString().padStart(2, '0')
const date = dateobj.getDate().toString().padStart(2, '0')
const hours = dateobj.getHours().toString().padStart(2, '0')
const minutes = dateobj.getMinutes().toString().padStart(2, '0')
const today = new Date()
if (today.getTime() - time <= 1000*60) {
return '刚刚'
}
if (today.getTime() - time < 1000*60*60) {
return Math.floor(((today.getTime() - time) / 1000 / 60)) + "分钟前"
}
// xx:xx
if (today.getTime() - time < 1000*60*60*24 && today.getDate() === dateobj.getDate()) {
return hours+":"+minutes
}
// 昨天xx:xx
if (today.getTime() - time < 1000*60*60*48 && (
today.getDate() === 1?
new Date(today.getFullYear(), today.getMonth(), 0).getDate() === dateobj.getDate() : // 判断是不是最后一天
today.getDate() - dateobj.getDate() === 1)) // 判断日期相差1
{
return '昨天'+hours+":"+minutes
}
// xx月xx日
if (today.getFullYear() === dateobj.getFullYear()) {
return month+"月"+date+"日"
}
return year+"年"+month+"月"+date+"日"
};
build() {
RelativeContainer() {
Refresh({ refreshing: $$this.isRefreshing }) {
List() {
ForEach(this.messageSource, (item: listType, index: number) => {
ListItem() {
Row({ space: 10 }) {
Text('title')
Text(Index.timeAgo(item.title,this.update))
}
.width('100%')
.height(40)
.padding({ left: 10, right: 10 })
}
})
}
}
.onRefreshing(() => {
this.isRefreshing=false
})
.pullToRefresh(true)
Button('点击刷新').onClick((event: ClickEvent) => {
this.update++
}).margin({top:100})
}
.height('100%')
.width('100%')
}
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
针对HarmonyOS 鸿蒙Next list组件在数据不更新的情况下如何重新渲染的问题,以下是一些解决方法:
-
使用
setState
更新数据:- 当list组件的数据源发生变化时,确保使用
setState
或相应的状态更新函数来更新数据。这可以触发组件的重新渲染。
- 当list组件的数据源发生变化时,确保使用
-
复制并替换数组:
- 如果直接修改数组中的对象导致页面不重新渲染,可以先复制一个临时的数组,修改临时数组中的值,然后将临时数组赋值给原数组。这是因为
@State
只是监听数组的地址值,只有地址值改变时才会重新渲染页面。
- 如果直接修改数组中的对象导致页面不重新渲染,可以先复制一个临时的数组,修改临时数组中的值,然后将临时数组赋值给原数组。这是因为
-
使用
map
方法:- 另一种方法是修改数据后,使用
map
方法遍历数组并返回一个新数组。由于返回了一个新数组,页面也会重新渲染。
- 另一种方法是修改数据后,使用
-
触发刷新机制:
- 对于支持下拉刷新的list组件,可以通过触发下拉刷新来强制重新渲染组件。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。