HarmonyOS应用开发实战:猫猫大作战-forEach 更新与列表渲染
·


前言
ForEach 是 ArkUI 中遍历数组渲染列表的组件。在「猫猫大作战」中,ForEach 用于渲染棋盘上的猫咪列表。
一、ForEach 基础
Column() {
ForEach(this.cats, (cat: Cat) => {
CatItem({ cat })
}, (cat: Cat) => cat.id) // key 生成器
}
二、key 的重要性
// ✅ 使用唯一 ID 作为 key
ForEach(this.cats, (cat) => { CatItem({ cat }) }, (cat) => cat.id)
// 🚫 不要用索引作为 key(列表变动时导致混乱)
ForEach(this.cats, (cat) => { CatItem({ cat }) }, (_, idx) => idx)
三、棋盘渲染
@State cats: Cat[] = [];
build() {
Stack() {
// 棋盘背景
GameBoardGrid()
// 猫咪覆盖层
ForEach(this.cats, (cat: Cat) => {
CatItem({
cat: cat,
onClick: () => this.onCatClick(cat)
})
.position({
x: cat.x * 60,
y: cat.y * 60,
})
}, (cat: Cat) => cat.id)
}
}
四、更新性能
// 更新整个猫咪列表(游戏引擎每帧返回新数组)
updateCats(newCats: Cat[]): void {
this.cats = newCats; // ForEach 自动 diff 更新
// key 不变则复用组件,key 变化则重建
}
五、ForEach vs LazyForEach
| 特性 | ForEach | LazyForEach |
|---|---|---|
| 渲染策略 | 全量渲染 | 按需渲染 |
| 数据量 | < 100 条 | > 100 条 |
| 适用场景 | 猫咪列表(~40) | 排行榜(200+) |
六、最佳实践
- 始终提供 key:使用唯一 ID 而非索引
- 不可变 key:key 在元素生命周期内不变
- 适量数据用 ForEach:猫咪列表 40 条以内
- 大量数据用 LazyForEach:排行榜用延迟加载
总结
ForEach 遍历数组渲染列表,配合唯一 key 高效更新。核心要点:cat.id 唯一 key、 数据量小用 ForEach、 数据量大用 LazyForEach。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
更多推荐


所有评论(0)