当前位置: 首页 > news >正文

鸿蒙应用开发:ForEach 循环渲染用法详解

文章目录

    • 一、引言
    • 二、基础用法:告别手动重复
      • 2.1 三个参数
      • 2.2 实战代码
    • 三、进阶用法:理解 Key 的重要性
      • 3.1 不指定 Key 的问题
      • 3.2 正确指定 Key
      • 3.3 使用建议
    • 四、总结

一、引言

在鸿蒙应用开发中,我们经常需要渲染列表数据。比如一个热榜页面,上面有很多热点条目。如果手动一个一个去写组件,不仅代码冗余,而且维护困难。这时候,ForEach循环渲染组件就派上用场了。本文将带你快速掌握ForEach的基本用法和高级技巧。

二、基础用法:告别手动重复

假设我们要渲染一个热榜列表,最原始的方式是手动编写每一个Text组件:

Text("热点1") Text("热点2") Text("热点3") // ... 如果有100条,就要写100个

这样显然不现实。使用ForEach可以轻松解决这个问题。

2.1 三个参数

ForEach接受三个参数:

参数必填说明
arr数据源,必须是数组类型
itemGenerator组件生成函数,为每个数组元素创建对应的子组件
keyGenerator键值生成函数,为每个数组项生成唯一且持久的键值。若未提供 keyGenerator,框架默认使用 index + ‘__’ + JSON.stringify(item)作为键值

2.2 实战代码

首先,创建一个数组作为数据源:

@State hotList: string[] = ["热点1", "热点3", "热点4"]

然后,在build方法中使用ForEach进行循环渲染,完整代码如下:

@Entry @Component struct Index { @State hotList: string[] = ["热点1", "热点3", "热点4"] build() { Column() { ForEach(this.hotList, (item: string) => { Text(item) .fontSize(30) .margin({ top: 10 }) }) } } }

代码解释

  • 第一个参数this.hotList是数据源。
  • 第二个参数是一个箭头函数,item代表数组中的每一项。这里我们为每一项创建一个Text组件,并显示该项的内容。

运行后,页面就会自动渲染出四个Text组件,显示对应的热点内容。这样,无论数据源有多少项,代码都只需要写一次,非常方便。

三、进阶用法:理解 Key 的重要性

ForEach的第三个参数key生成函数非常关键,它决定了当数据源变化时,哪些组件需要被重新渲染。

3.1 不指定 Key 的问题

看下面这个例子:

@Entry @Component struct Index { @State hotList: string[] = ["热点1", "热点3", "热点4"] build() { Column() { Button("添加元素2") .onClick(() => { this.hotList.splice(1, 0, "热点2") // 在索引1处插入元素2 }) ForEach(this.hotList, (item: string) => { MyComponent({ value: item }) }) } } } @Component struct MyComponent { @Prop value:string aboutToAppear(): void { console.log(`${this.value} 被渲染了`) } build() { Text(item) .fontSize(30) .margin({ top: 10 }) } }

MyComponent是一个自定义组件,它在aboutToAppear生命周期中打印日志,表示自己被渲染了。

当我们点击按钮添加元素热点2后,数组变为["热点1", "热点2", "热点3", "热点4"]。按道理,只有新添加的热点2需要渲染,但实际日志可能会显示热点3热点4也被重新渲染了。

原因

  1. ForEach在不指定第三个参数时,ForEach渲染出来的组件默认使用索引开头的字符串(index + ‘__’ + JSON.stringify(item))作为key
  2. 通过index + ‘__’ + JSON.stringify(item)可知,在未添加热点2的时候,热点3对应的 key 为"1__热点3"热点4对应的 key 为"2_热点4"
  3. 添加元素热点2后,数组内的元素索引发生了变化,原来索引为1的元素热点3变成了索引2,原来索引为2的元素热点4变成了索引3
  4. 由于默认key与索引息息相关,相关元素的索引发生了变化,它对应的key也会发生变化。
  5. 此时,热点3对应的 key 为"2__热点3"热点4对应的 key 为"3_热点4"
  6. key发生变化后,这些key发生变化的组件就会被重新渲染。

3.2 正确指定 Key

为了解决上述问题,我们需要为每一项指定一个唯一且稳定的 key,而不是依赖索引。

ForEach(this.numbers, (item: number) => { MyComponent({ value: item }) }, (item: number) => item.toString()) // 使用元素本身的值作为 key

现在,key 分别是"热点1""热点3""热点4"。当我们插入元素热点2时,新元素的 key 是"热点2",而"热点3""热点4"的 key 没有变化,因此它们不会被重新渲染,只有新元素热点2会被渲染。

3.3 使用建议

  • 优先使用数据中自带的唯一 ID(如item.id)作为 key。
  • 避免使用索引作为 key,除非你明确知道数据不会发生插入、删除或排序操作。
  • 如果发现数据变了但页面没有更新,首先检查 key 是否使用不当。

四、总结

ForEach是鸿蒙应用开发中非常实用的循环渲染组件。通过它,我们可以高效地渲染列表数据,告别手动重复编写 UI 代码。同时,正确理解和使用第三个参数key,可以避免不必要的组件重渲染,提升应用性能。

希望本文能帮助你快速上手ForEach,在实际开发中写出更优雅、高效的代码。

http://www.gsyq.cn/news/1575599.html

相关文章:

  • 百考通AI,数据分析智能生成,更高效精准,让数据为你说话
  • 2026年 扬州外贸品牌海外推广TOP榜单:跨境营销策略与本土化服务深度解析 - 品牌发掘
  • 覆盖扫码 / 断连 / 消息异常,OpenClaw 2.7.9 微信机器人故障速查表
  • 计算机毕业设计之jsp基于BS架构的家庭理财管理系统的设计与实现
  • 2026清远营业性演出许可证有没有正规代办推荐 - 资讯速览
  • 上海高端酒水回收市场调研及靠谱服务商名录汇总 - 海棠依旧大
  • keytool-importkeypair深度解析:企业级Java密钥管理架构设计
  • Vue 3 自定义插件开发实战:从原理到生产级权限指令
  • AI工程化三支柱:Agent可视化、模型安全护栏与推理引擎优化
  • 小米汽车音响升级推荐排行:2026原厂升级与改装方案榜单,告别原车听个响 - 资讯快报
  • 2026济南财税公司靠谱推荐榜|企业财税托管避坑实测榜单 - 资讯快报
  • 2026年合肥市初三中考成绩200分左右适合上什么学校?——推荐合肥理工学校 - 教育为先
  • 告别 9.9 元低价内卷!MFi 认证打造产品差异化,拉高单品利润与品牌档次
  • 物理引导与半影感知:航空航天影像阴影处理的核心技术解析
  • 5大核心优势解密:跨平台Android投屏工具的终极选择
  • 企业内网离线部署Playwright自动化测试框架全流程实战指南
  • 2026/4/3课程博客 软件测试复习:设计题(等价类划分专项)
  • 2026年深圳高考复读TOP10榜单出炉,这些机构提分显著 - 运营方法论
  • 新手如何选购尤克里里?从材质到尺寸!2026零基础尤克里里选购指南
  • 2026阳江营业性演出许可证代办推荐哪家专业靠谱 - 资讯速览
  • 2026年申请美国藤校哪家机构最擅长,别急着签约先把这些细节看明白 - 环球新视野
  • 丢掉 Scrapy 的厚重,试试 Crawl4AI:专为大模型时代打造的轻量级网页抓取利器
  • PMSM矢量控制软件架构:数据流与状态机设计实践
  • 2026年深圳高考复读TOP榜单发布:哪些机构值得选? - 运营老默复盘
  • DSP56321串行通信接口(ESSI/SCI)编程模型与实战避坑指南
  • 上海嘉定江桥汽车音响探店实录|20 年老店音乐人生,本地车主实测靠谱改装门店 - 音乐人生汽车音响
  • 基于GPT-4o的医学影像问答对自动化生成:提示工程与质量保证实践
  • 2026/4/8课程博客 软件测试复习:设计题(边界值分析专项)
  • 唐山本地人私藏的靠谱石墨烯地暖品牌 农村自建房、老房改造都能用 - 企业名录精选推荐
  • 用 Dockerfile 构建生产级 Apache Web 服务器