在 OpenHarmony(ArkUI)中,“列表组件”通常指 List / ListItem,以及与之配合的 LazyForEach。优化列表的核心目标是:减少首屏耗时、降低内存占用、提升滑动流畅度(帧率)。
下面从 性能、渲染、内存、交互 四个维度系统说明优化方法。
LazyForEach(而不是 ForEach)✅ 正确方式:
List() {
LazyForEach(this.dataSource, (item) => {
ListItem() {
MyItemView({ item })
}
}, item => item.id)
}
❌ 避免:
ForEach(this.list, item => {
ListItem() { ... }
})
原因:
ForEach 会一次性创建所有节点LazyForEach 只创建可视区域 + 缓冲区的节点cachedCount 控制预加载数量List() {
LazyForEach(...)
}
.cachedCount(5)
建议:
3 ~ 51 ~ 3过于大会增加内存。
ListItem 内部避免:
✅ 推荐结构:
ListItem() {
Row() {
Image(...)
Text(...)
}
}
@Reusable 复用列表项OpenHarmony 支持组件复用:
@Reusable
@Component
struct MyItem {
@State item: ItemModel = new ItemModel()
aboutToReuse(params: Record<string, Object>) {
this.item = params.item as ItemModel
}
build() {
Row() { ... }
}
}
List 使用:
List() {
LazyForEach(this.data, item => {
ListItem() {
MyItem({ item })
}
})
}
✅ 效果:减少组件创建和销毁次数
@State 过多ListItem 中:
IDataSource实现 totalCount / getData / registerDataChangeListener
避免直接操作大数组。
objectFit: ImageFit.CoverImage(url)
.width(80)
.height(80)
.objectFit(ImageFit.Cover)
List()
.edgeEffect(EdgeEffect.None)
onScroll 中的逻辑❌ 错误:
.onScroll(() => {
// 大量计算
})
✅ 正确:
sticky 小心使用List() {
ListItemGroup() { ... }
}
.sticky(StickyStyle.Header)
仅在必要场景使用。
| 场景 | 优化前 | 优化后 |
|---|---|---|
| 1000 条数据 | 卡顿 | 流畅 |
| 内存 | 高 | 低 |
| 首屏 | 慢 | 快 |
LazyForEach@ReusablecachedCount如果你愿意,可以:
我可以直接帮你针对性改代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。