arkUI:遍历数据数组动态渲染(forEach)
arkUI:遍历数据数组动态渲染(forEach)
- 1 主要内容说明
- 2 相关内容
- 2.1 ForEach 的基本语法
- 2.2 简单遍历数组
- 2.2 多维数组遍历
- 2.4 使用唯一键
- 2.5 源码1的相关说明
- 2.5.1 源码1 (遍历数据数组动态渲染)
- 2.5.2 源码1运行效果
- 3.结语
- 4.定位日期
1 主要内容说明
在 ArkUI 中,ForEach 是用于遍历数据数组并动态渲染 UI 组件的一种方法。它类似于 JavaScript 中的 Array.forEach,但在 UI 框架中,它有特定的要求来确保每个渲染项都有唯一标识,以便在组件更新时保持高效、准确的渲染。通过 ForEach 方法,可以高效地遍历数据并动态生成 UI 项目,非常适合用于列表、网格等多项数据的展示。
2 相关内容
2.1 ForEach 的基本语法
ForEach(dataArray, // 需要遍历的数据数组(item) => { // 回调函数:每个遍历项的处理逻辑// 渲染逻辑},(key) => { // 唯一键生成函数(可选):返回每个项的唯一键值// 键值生成逻辑}
)
dataArray
---------- 需要遍历的数据,通常是一个数组。回调函数 (item) => {...}
---------- 每次遍历的当前项。可以使用该回调函数中的 item 渲染每一项内容。唯一键生成函数 (key) => {...}
---------- 这是可选参数,但建议使用。用于为每个渲染项生成唯一的键值。
---------- 生成的键可以是字符串或数值类型,以保证在 ForEach 渲染的每个组件项中都是唯一的。
2.2 简单遍历数组
ForEach(["苹果", "香蕉", "菠萝"], // 数据数组(item) => { // 遍历项Text(item); // 渲染每一项为文本}
);
2.2 多维数组遍历
- 可以嵌套 ForEach 以处理多维数组,例如二维数组。以下示例展示了如何遍历一个二维数组
const fruits = [["苹果1号", "苹果2号"],["香蕉1号", "香蕉2号"],
];ForEach(fruits,(subArray) => { // 每个 subArray 是一个子数组ForEach(subArray,(fruit) => {Text(fruit);});}
);
2.4 使用唯一键
- 为了避免重复的键,推荐使用第三个参数生成唯一键。以下示例展示了如何基于元素值生成唯一键
ForEach(fruits,(subArray) => {ForEach(subArray,(fruit) => {Text(fruit);},(fruit) => fruit // 使用 fruit 字符串本身作为唯一键);}
);
当数据变动时,ForEach 会根据唯一键来判断是否需要重新渲染特定项。如果没有唯一键,可能会出现渲染错误或性能问题。对于复杂结构或大量数据,确保键的唯一性可以提高渲染效率,避免多余的 UI 刷新。
2.5 源码1的相关说明
源码1定义了一个名为 PageForEach 的组件,在该组件中使用了三组 Flex 布局,每组 Flex 布局内通过 ForEach 方法遍历并渲染 arr 数组中的数据。arr 是一个二维字符串数组,包含不同水果的编号信息。
ForEach 循环
:
---------- 每个 ForEach 循环内都嵌套了两层遍历:
---------- 第一层遍历 arr 的行(每种水果的编号列表)。
---------- 第二层遍历每个水果编号,并将其渲染成 Text 文本。
---------- 在第二个和第三个 Flex 布局的 ForEach 中,指定了唯一键生成函数以防止渲染重复项。
---------- 第三个flex布局中,设置了一个叫“自命名键”的键,因为只有一个键,所以forEach只会输出第一个元素的内容,第一层数组会进行一次循环,每次第二层数组只会根据“自命名键”单个键输出第一个元素的内容。第一层数组是有多个二层数组的。
2.5.1 源码1 (遍历数据数组动态渲染)
@Entry
@Component
struct PageForEach {// 定义一个二维数组,保存不同种类的水果名称@State arr: string[][] = [["苹果1号", "苹果2号", "苹果1号", "苹果4号"],["香蕉1号", "香蕉2号", "香蕉1号", "香蕉4号"],["菠萝1号", "菠萝2号", "菠萝1号", "菠萝4号"],["西瓜1号", "西瓜2号", "西瓜1号", "西瓜4号"],["椰子1号", "椰子2号", "椰子1号", "椰子4号"],];// 页面构建方法build() {Column() {// 第一个 Flex 布局,宽度设置为 25%Flex({wrap: FlexWrap.Wrap,}) {ForEach(this.arr,(item1: string[]) => {ForEach(item1,(item2: string) => {// 将数组中的每个字符串显示为文本Text(item2).width("25%") // 设置每个文本的宽度为 25%.textAlign(TextAlign.Center) // 文本居中对齐});});}.width("100%") // Flex 布局宽度占满整个容器.backgroundColor("#ffecec00") // 背景色.margin("5%"); // 外边距// 第二个 Flex 布局,宽度设置为 33%Flex({wrap: FlexWrap.Wrap,}) {ForEach(this.arr,(item1: string[]) => {ForEach(item1,(item2: string) => {Text(item2).width("33%") // 设置每个文本的宽度为 33%.textAlign(TextAlign.Center)},(item3: string) => {// 每个 item 的唯一键return item3;});});}.width("100%").backgroundColor("#ff11d92f").margin("5%");// 第三个 Flex 布局,使用自定义的键Flex({wrap: FlexWrap.Wrap,}) {ForEach(this.arr,(item1: string[]) => {ForEach(item1,(item2: string) => {Text(item2).width("33%").textAlign(TextAlign.Center)},(item3: string) => {// 设置自定义的键值 "自命名键"(注意:所有元素使用相同键可能会影响性能)return "自命名键";});});}.width("100%").backgroundColor("#ffec5e5e").margin("5%");}}
}
2.5.2 源码1运行效果
3.结语
因为最近用到了forEach,由想起了二维数组的内容,于是将两者结合编写了本文。用以往后的回顾和查询。
由于笔者的能力有限,创作的内容有所不足在所难免,也敬请读者包涵和指出,万分感谢!
4.定位日期
2024-11-11;
23:54;
相关文章:

arkUI:遍历数据数组动态渲染(forEach)
arkUI:遍历数据数组动态渲染(forEach) 1 主要内容说明2 相关内容2.1 ForEach 的基本语法2.2 简单遍历数组2.2 多维数组遍历2.4 使用唯一键2.5 源码1的相关说明2.5.1 源码1 (遍历数据数组动态渲染)2.5.2 源码1运行效果 …...
js中import引入一个export值可以被修改。vue,react
import引入的数据实际就是数据本身。 如果导出的是一个对象,该对象引入后被更改了,则会影响其他文件引入此对象 解释示例: // resources.js const obj {} export {obj} 当在a.js中import引入一个空对象obj,并且新增一个属性ob…...

PDF24:多功能 PDF 工具使用指南
PDF24:多功能 PDF 工具使用指南 在日常工作和学习中,PDF 是一种常见且重要的文档格式。无论是查看、编辑、合并,还是转换 PDF 文件,能够快速高效地处理 PDF 文档对于提高工作效率至关重要。PDF24 是一款免费、功能全面的 PDF 工具…...

域名解析线路类型有哪几种
在网络世界中,域名解析是将域名转换为IP地址的关键环节,而域名解析线路类型的不同则为域名解析提供了多样化的策略,以满足不同用户和网络环境的需求。以下是几种常见的域名解析线路类型。 电信线路 电信线路解析主要是针对中国电信网络用户…...

Spring资源加载模块,原来XML就这,活该被注解踩在脚下 手写Spring第六篇了
这一篇让我想起来学习 Spring 的时,被 XML 支配的恐惧。明明是写Java,为啥要搞个XML呢?大佬们永远不知道,我认为最难的是 XML 头,但凡 Spring 用 JSON来做配置文件,Java 界都有可能再诞生一个扛把子。 <…...

[运维][Nginx]Nginx学习(2/5)-Nginx高级
Nginx服务器基础配置实例 前面我们已经对Nginx服务器默认配置文件的结构和涉及的基本指令做了详细的阐述。通过这些指令的合理配置,我们就可以让一台Nginx服务器正常工作,并且提供基本的web服务器功能。 接下来我们将通过一个比较完整和最简单的基础配…...
【快捷入门笔记】mysql基本操作大全-SQL数据库
SQL数据库 一、创建数据库 – 创建一个新数据库 fang_fang CREATE DATABASE fang_fang;– 显示所有数据库以确认创建 SHOW DATABASES;– 使用新数据库fang_fang USE fang_fang;– 检查我们正在使用哪个数据库 SELECT DATABASE();二、 删除数据库 –当你确定数据库存在并…...
【LeetCode】【算法】15. 三数之和
LeetCode 15. 三数之和 题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不…...

传输协议设计与牧村摆动(Makimoto‘s Wave)
有一条活鱼和一条死鱼,你准备怎么做,你会将活鱼红烧或将死鱼清蒸吗?好的食材只需要最简单的烹饪,不好的食材才需要花活儿。 我此前的文字几乎都在阐述一个观点,广域网就是那条死鱼,数据中心则是那条活鱼。…...

JMeter进阶篇
目录 上篇导航: 总目录: 一、逻辑控制器: 1.逻辑控制器和关联: 2.if逻辑控制器: 3.forEach控制器: 4.循环控制器: 二、关联: 1.xpath: 2.正则表达式提取器&…...
LabVIEW编程基础教学(一)--介绍
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种基于图形化编程的开发环境,专为工程应用、测试、测量、控制系统等设计。与传统的文本编程语言不同,LabVIEW 使用图形化的方式通过“数据流”模型来表示程序逻…...
HVV蓝队基础
免责声明 学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 企业网络架构 企业技术和信…...

[运维][Nginx]Nginx学习(1/5)--Nginx基础
Nginx简介 背景介绍 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个【POP3/SMTP/IMAP代理服务器】,是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是2004年10月4号发布的0.1.0版本。另外值得一…...
创客节小学组C++模拟题
来源:加码未来2024年深圳罗湖区创客节模拟题(小学组) 第一题 题目描述 给你n个数,找出出现次数超过一半的数。题目保证这样的数一定存在。 输入格式 第一行一个整数n,(n<=1000) 第二行n个整数(<1000000) 输出格式 输出一个整数 样例输入 5 1 2 3 3 3 样例输…...

阿里云ECS服务器使用限制及不允许做的事情
阿里云ECS(Elastic Compute Service)是一种高性能的弹性计算服务,允许用户在云端创建和管理虚拟服务器。尽管ECS提供了强大的功能,但在使用过程中,阿里云有一些限制和不允许的行为。以下是一些主要的使用限制和禁止行为…...

Linux开发讲课49--- Linux 启动过程分析
理解运转良好的系统对于处理不可避免的故障是最好的准备。 启动过程非常简单。内核在单核上以单线程和同步状态启动,似乎可以理解。但内核本身是如何启动的呢?initrd(initial ramdisk) 和引导程序(bootloader)具有哪些功能&#…...

Java-03
目录 算法 1.小美的因子查询 2.小美的密码 3.小美的数组删除 4.小美和大富翁 知识点 InnoDB中的行级锁是怎么实现的? 介绍一下Java中的IO流 讲讲Java的跨平台原理 COUNT(1)与COUNT(*)区别 Redis 为什么要用…...

微积分复习笔记 Calculus Volume 1 - 5.3 The Fundamental Theorem of Calculus
5.3 The Fundamental Theorem of Calculus - Calculus Volume 1 | OpenStax...
c++如何绑定一个类与类内成员的关系
在 C 中,成员函数和成员变量的归属关系(即某个成员属于哪个类)是通过编译器的多种机制和语言特性来实现和管理的。理解这些机制有助于更深入地掌握 C 的面向对象特性、内存管理以及编译过程。以下是 C 如何确定某个成员函数或成员变量属于特定…...

关于解决使用VMWare内的虚拟机无法识别USB问题小结
目录 前言 0. 查看是不是没有开启USB3.0的支持 1. 检查一下是否禁用了VMWare USB服务 2. 无奈之举 前言 笔者今天帮助一位同志解决了VMWare内的虚拟机不识别挂载设备的办法。这里对笔者使用的排查手段做一个总结。 0. 查看是不是没有开启USB3.0的支持 我们的第一件事情就…...

AUTOSAR实战教程--标准协议栈实现DoIP转DoCAN的方法
目录 软件架构 关键知识点 第一:PDUR的缓存作用 第二:CANTP的组包拆包功能 第三:流控帧的意义 配置过程 步骤0:ECUC模块中PDU创建 步骤1:SoAD模块维持不变 步骤2:DoIP模块为Gateway功能添加Connection 步骤3:DoIP模块为Gateway新增LA/TA/SA 步骤4:PDUR模…...

【选配电脑】CPU核显工作机控制预算5000
【选配电脑】CPU核显工作机控制预算5000 1.背景2.配置及估价3.选配的说明 1.背景 不需要独立显卡,内存,硬盘尽量大; 预算控制到5000, 主板型号,电源功率支持后续添加独立显卡。 时间节点:2025.06.07 2.配…...

NLP学习路线图(二十):FastText
在自然语言处理(NLP)领域,词向量(Word Embedding)是基石般的存在。它将离散的符号——词语——转化为连续的、富含语义信息的向量表示,使得计算机能够“理解”语言。而在众多词向量模型中,FastText 凭借其独特的设计理念和卓越性能,尤其是在处理形态丰富的语言和罕见词…...

生成模型+两种机器学习范式
生成模型:从数据分布到样本创造 生成模型(Generative Model) 是机器学习中一类能够学习数据整体概率分布,并生成新样本的模型。其核心目标是建模输入数据 x 和标签 y 的联合概率分布 P(x,y),即回答 “数据是如何产生的…...
Nginx Stream 层连接数限流实战ngx_stream_limit_conn_module
1.为什么需要连接数限流? 数据库/Redis/MQ 连接耗资源:恶意脚本或误配可能瞬间占满连接池,拖垮后端。防御慢速攻击:层叠式限速(连接数+带宽)可阻挡「Slow Loris」之类的 TCP 低速洪水。公平接入…...
二元函数可微 切平面逼近 线性函数逼近
二元函数 f ( x , y ) f(x, y) f(x,y) 在某点可微 的含义,可以从几何直观、严格数学定义、与一阶偏导数的关系三个层面来理解: 🔹1. 几何直观上的含义(最易理解) 二元函数 f ( x , y ) f(x, y) f(x,y) 在点 ( x 0 …...
STM32开发中,线程启动异常问题排查简述
1. 参数传递问题 错误类型:线程属性错误地使用。影响:线程属性(如堆栈大小、优先级)不匹配可能导致线程创建失败或行为异常。验证方法:检查 线程创建的返回值,若为 NULL 则表示线程创建失败。 2. 系统资源…...

家政小程序开发——AI+IoT技术融合,打造“智慧家政”新物种
基于用户历史订单(如“每周一次保洁”)、设备状态(如智能门锁记录的清洁频率),自动生成服务计划。 结合天气数据(如“雨天推荐玻璃清洁”),动态推送服务套餐。 IoT设备联动&#x…...

Keil开发STM32生成hex文件/bin文件
生成hex文件生成bin文件 STM32工程的hex文件和bin文件都可以通过Keil直接配置生成 生成hex文件 工程中点击魔术棒,在 Output 中勾选 Create HEX File 选项,OK保存工程配置 编译工程通过后可以看到编译输出窗口有创建hex文件的提示 默认可以在Output文…...

[GitHub] 优秀开源项目
1 工具类 1.1 桌面猫咪互动 BongoCat...