当前位置: 首页 > 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.jsqmd.com/news/1063659/

相关文章:

  • 2026西安GEO公司口碑对比:西安豆包AI排名与推荐位占位怎么做 - 资讯快报
  • 几家宠物一站式服务商的实际响应时间与收费明细究竟差异多少?
  • 唐山烧烤测评榜:本地人私藏 20 年老店首选 - 资讯速览
  • 计算机毕业设计之jsp基于BS架构的家庭理财管理系统的设计与实现
  • 百考通AI,数据分析智能生成,更高效精准,让数据为你说话
  • 2026年 扬州外贸品牌海外推广TOP榜单:跨境营销策略与本土化服务深度解析 - 品牌发掘
  • 20251216杜立实验四实验报告
  • 覆盖扫码 / 断连 / 消息异常,OpenClaw 2.7.9 微信机器人故障速查表
  • 最新深圳法律业务律师推荐指南2026:深圳离婚律师离婚财产分割股权分割抚养权纠纷起诉离婚流程 - 逻辑孤岛
  • 2026过炉托盘行业:三大核心发展趋势解读 - 资讯快报
  • Chat LangChain生产环境架构设计:多模型容错与监控系统解决方案
  • 人体姿势智能检索系统:用动作语言重新定义图像搜索
  • WeChatMsg终极指南:数字记忆重构与对话资产化完整方案
  • 如何免费解锁WeMod专业功能:Wand-Enhancer完整实战指南
  • Let‘s Encrypt介绍(免费、自动化、开放的SSL/TLS证书颁发机构CA,Certificate Authority)cert-manager
  • 2026/4/2课程博客 软件测试复习:选择题考点(测试工具+等价类划分)
  • 零基础学AI人工智能:9.4 聚类算法
  • PvZ Toolkit终极指南:植物大战僵尸PC版最全修改器使用教程
  • 2026清远营业性演出许可证有没有正规代办推荐 - 资讯速览
  • 人类学习的本质:从DeepSeek V4看动态反馈与多专家协同
  • Video2X深度解析:如何通过C++架构重构实现高性能视频AI处理
  • 上海高端酒水回收市场调研及靠谱服务商名录汇总 - 海棠依旧大
  • 基于视觉语言模型的交通事故自动分析与报告生成技术实践
  • 无痛季度规划:用实时信号替代传统OKR流程
  • 视频字幕文字提取全攻略:2026保姆级教程,手把手教你免费搞定
  • Vue 3 自定义插件开发实战:从原理到生产级权限指令
  • 苏州卫生间免砸砖防水补漏哪家专业?服务商挑选标准与适用场景 - 徽顺虹
  • 2026年口碑好的 最新 烟台家常菜特色美食餐厅、烟台家常菜老字号饭馆排行:5家地道门店一览 - 起跑123
  • 2026年6月澳洲旅游签证机构优先考虑哪家?5家主流机构资质与服务对比 - 资讯快报
  • keytool-importkeypair深度解析:企业级Java密钥管理架构设计