在 OpenHarmony(ArkUI) 中,列表组件复用主要通过 LazyForEach + 组件复用机制(@Reusable) 来实现,目的是减少组件创建/销毁开销,提升长列表性能。
下面按使用场景 → 实现方式 → 示例代码来说明。
用于按需加载列表数据,只创建可视区域内的组件。
LazyForEach(
dataSource,
(item) => {
ListItem() {
MyItem({ item: item })
}
},
item => item.id
)
❌ ForEach 不适合长列表(会一次性创建)
OpenHarmony 提供 组件复用注解,让 Item 在滑出可视区后被回收复用。
@Reusable
@Component
struct MyItem {
@State item: ItemData = new ItemData()
aboutToReuse(params: { item: ItemData }) {
this.item = params.item
}
build() {
Text(this.item.title)
}
}
✅ 系统会在滚动时:
aboutToReuse 更新数据class ItemData {
id: string = ''
title: string = ''
}
class MyDataSource implements IDataSource {
private list: ItemData[] = []
totalCount(): number {
return this.list.length
}
getData(index: number): ItemData {
return this.list[index]
}
registerDataChangeListener() {}
unregisterDataChangeListener() {}
}
@Reusable
@Component
struct MyItem {
@State item: ItemData = new ItemData()
aboutToReuse(params: { item: ItemData }) {
this.item = params.item
}
build() {
Row() {
Text(this.item.title)
.fontSize(16)
}
.height(60)
}
}
@Entry
@Component
struct Page {
private data = new MyDataSource()
aboutToAppear() {
for (let i = 0; i < 1000; i++) {
this.data.list.push({
id: i.toString(),
title: 'Item ' + i
})
}
}
build() {
List() {
LazyForEach(this.data, (item: ItemData) => {
ListItem() {
MyItem({ item })
}
}, item => item.id)
}
}
}
✅ 必须做
LazyForEach@ReusableaboutToReuse 更新数据❌ 避免
ForEach 渲染长列表cachedCountSwiper / Grid 复用策略如果你用的是 API 9 / 10 / 11 或 ArkTS / eTS,我可以给你对应版本的示例,或者帮你优化某个具体列表场景。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。