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

鸿蒙应用开发从入门到实战(九):ArkTS渲染控制

大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容、欢迎关注!

​ ArkTS拓展了TypeScript,可以结合ArkUI进行渲染控制,是的界面设计具有可编程性。本文简要描述鸿蒙应用开发中的条件渲染和循环渲染。

一、条件渲染

1.1 概述

​ 条件渲染可根据应用的不同状态渲染不同的UI界面,例如前文的开/关灯案例,以及以下的播放/暂停案例,均可使用条件渲染实现。

​ 常见案例:网站的登录和注册模块、商城网站会员价格显示等

1.2 语法

条件渲染的语法如下

if (...){//UI描述 
}else if (...){//UI描述
}else{//UI描述
}

1.3 案例

表白案例

@Entry
@Component// 条件渲染
struct ConditionPage {@State isSuc: boolean = true;build() {Column({space:20}) {if (this.isSuc) {Text('表白成功,O(∩_∩)O')} else {Text('继续加油,😔')}Button('表白').backgroundColor(Color.Green).onClick(()=>{this.isSuc=!this.isSuc})}.width('100%').height('100%').margin({top:50})}
}

二、循环渲染

2.1 概述

​ 循环渲染可使用ForEach语句基于一个数组来快速渲染一个组件列表,例如以下案例中的选项列表就可通过循环渲染实现。

2.2 语法

ForEach循环渲染的语法如下

ForEach(arr: any[], itemGenerator: (item: any, index?: number) => void,keyGenerator?: (item: any, index?: number) => string
)

各参数的含义如下

  • arr

需要进行循环渲染的数据源,必须为数组类型,例如上述案例中的

@State options: string[] = ["苹果", "桃子", "香蕉", "橘子"];
  • itemGenerator

组件生成函数,用于为arr数组中的每个元素创建对应的组件。该函数可接收两个参数,分别是

    • item:arr数组中的数据项
    • index(可选):arr数组中的数据项的索引

例如上述案例中的

(item: string) => {Button(item).width(100).backgroundColor(Color.Green).onClick(() => {this.answer = item;})}
  • keyGenerator(可选):

key生成函数,用于为arr数组中的每个数据项生成唯一的key

key的作用

ForEach在数组发生变化(修改数组元素或者向数组增加或删除元素)时,需要重新渲染组件列表,在重新渲染时,它会尽量复用原来的组件对象,而不是为每个元素都重新创建组件对象。key的作用就是辅助ForEach完成组件对象的复用。

具体逻辑如下:

ForEach在进行初次渲染时,会使用keyGenerator为数组中的每个元素生成一个唯一的key,并将key作为组件对象的标识。当数组发生变化导致ForEach需要重新渲染时,ForEach会再次使用keyGenerator为每个元素重新生成一遍key,然后ForEach会检查新生成的key在上次渲染时是否已经存在,若存在,ForEach就会认为这个key对应的数组元素没有发生变化,那它就会直接复用这个key所对应的组件对象;若不存在,ForEach就会认为这个key对应的元素发生了变化,或者该元素为新增元素,此时,就会为该元素重新创建一个组件对象。

开发者可以通过keyGenerator函数自定义key的生成规则。如果开发者没有定义keyGenerator函数,则系统会使用默认的key生成函数,即

(item: any, index: number) => { return index + '__' + JSON.stringify(item); }

在某些情况下默认的key生成函数,会导致界面渲染效率低下,此时可考虑通过keyGenerator函数自定义生成逻辑,例如如下场景

状态变量数组定义如下

@State arr:string[] = ["zhangsan","lisi","wangwu"]

ForEach语句如下

Column(){ForEach(this.arr,(item)=>{ Text(item) })
}

初次渲染时,每个元素对应的key依次为0__"zhagnsan"1__"lisi"2__"wangwu"。若现有一个操作是向arr数组头部插入新的元素,例如新元素为wanger,按照默认的key生成逻辑,插入新元素之后每个元素的key就会依次变为0__"wanger"1__"zhagnsan"2__"lisi"3__"wangwu",也就是所有元素的key都发生了变化,因此UI界面更新时需要为每个元素都重新创建组件对象,即便原有的元素没有发生变化也无法复用之前的组件,这样一来就导致了性能浪费。此时我们就可以考虑提供第三个参数,如下

Column(){ForEach(this.arr, (item)=>{ Text(item) }, item => JSON.stringify(item))
}

2.3 案例

爱好列表

@Entry
@Component// 循环控制
struct LoopPage {@State likes: string[] = ["唱歌", "跳舞", "学习", "打豆豆"];@State choose: string = ""; //注意string是小写build() {Row() {Column() {Text('你喜欢的是:' + this.choose)ForEach(this.likes, (item) => {Button(item).width(200).margin(10).onClick(()=>{this.choose=item})})}.width('100%')}.height('100%')}
}

《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容,防止迷路,欢迎关注!

相关文章:

鸿蒙应用开发从入门到实战(九):ArkTS渲染控制

ArkTS拓展了TypeScript,可以结合ArkUI进行渲染控制,是的界面设计具有可编程性。本文简要描述鸿蒙应用开发中的条件渲染和循环渲染。大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战…...

C# 2025年6-9月TIOBE排名增长及未来展望

根据 TIOBE 编程语言排行榜 2025 年 6 月至 9 月的公开数据,C# 的排名和市场份额变化如下(综合多个月份数据整理):一、 C# 在 2025 年 TIOBE 排行榜的连续增长趋势2025 年 6 月排名:第 5 位市场份额:4.69%2025 年 7 月排名:第 5 位市场份额:4.87%2025 年 8 月排名:第 …...

一个基于 .NET 开源、简易、轻量级的进销存管理系统

前言 最近有小伙伴在后台留言问:.NET 有值得推荐学习的进销存管理系统吗?今天大姚给大家推荐一个基于 .NET 开源、简易、轻量级的进销存管理系统:JxcLite。 项目介绍 JxcLite 是一个基于 Known 框架开发(基于 .NET Blazor 轻量级、跨平台、低代码、易扩展的插件开发框架)、…...

采用tree命令导出文件夹/文件的目录树(linux)

采用tree命令导出文件夹/文件的目录树(linux)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !…...

The 2024 ICPC Asia East Continent Online Contest (I) 4/12 A/F/G/M

M. Find the Easiest Problem 签到题,直接模拟即可点击查看代码 #include<bits/stdc++.h> #define int long long using namespace std; using pii=pair<int,int>; using ll = long long; using ull = unsigned long long; const ll inf = 1e18; const int mod = …...

深入解析 JVM 类加载机制:从字节码到运行时对象

一、概述:为什么需要类加载? Java 语言的核心特性之一是"一次编写,到处运行",这背后的关键在于 Java 虚拟机(JVM)和其类加载机制。当我们编写好 Java 代码并将其编译为 .class 字节码文件后,这些静态的字节码需要被加载到 JVM 中才能变为可执行的动态对象。类…...

博弈论学习(第二天)

博弈的基本理性假设: 一般来说,对于研究博弈问题,需要假设参与者具有完美理性,这分三方面,第一个就是参与者的偏好要有一定性,比如对风险的偏好,不能说一个参与者做第一个决策时属于风险接受型,而做第二个决策时就属于风险规避型。第二个就是参与者对所参与决策的问题具…...

PHP 和 Elasticsearch:给你的应用加个强力搜索引擎

PHP 和 Elasticsearch:给你的应用加个强力搜索引擎 现在做 Web 应用,搜索功能基本是标配。不管你做电商、CMS 还是社交应用,用户都希望搜索又快又准。如果你用 PHP 开发,肯定遇到过数据库搜索的瓶颈——数据一多就慢得要死。这时候 Elasticsearch 就能帮大忙了。 这篇文章会…...

2025年- H146-Lc459. 重复的子字符串(字符串)--Java版 - 实践

2025年- H146-Lc459. 重复的子字符串(字符串)--Java版 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...

坚果云 坚果 jianguoyun 怎么收文件?

怎么收文件? 坚果云 坚果 jianguoyun 怎么收文件?注册、登录、免费的空间是 1GB。创建新的收集 https://www.jianguoyun.com/d/home#/ 查看收集结果:https://www.jianguoyun.com/#/...

mssql创建字段依赖

CREATE TABLE temp061_t ( ID INT IDENTITY(1,1) PRIMARY KEY, RoleType INT NOT NULL, isSior INT NULL ); ALTER TABLE temp061_t ADD CONSTRAINT chk_is_sior CHECK ( (RoleType = 1 AND isSior IS NULL) OR (RoleType = 2 AND isSior IN (0,1,2)) ); -- 合法插入 INSERT IN…...

AT_agc053_b [AGC053B] Taking the middle

考虑将先手最大转化为后手最小。 那么可以发现,第 \(i\) 次操作先手一定能让后手从 \([n - i + 1, n + i]\) 中选取最小的一个元素,一定可以。因为考虑先手拿的顺序不重要,一定存在构造方案,使得能让任意一个元素为中位数。...

一款多功能Linux服务器Web管理面板

为什么使用 Docker 部署 EasyNode? 正如您所说,Docker 部署具有显著优势: 环境隔离与一致性:所有依赖(Node.js, PM2等)都封装在容器内,与宿主机环境隔离,避免冲突。在任何支持 Docker 的 Linux 发行版上,体验完全一致。 简化安装:无需在主机上手动安装 Node.js、配置…...

2025.9.16 测试

2025.9.16 测试1. Problem A: 逆序对(reverse) 根据冒泡,只要逆序对个数够就有方案 经过思考,我们找到第一个操作个数大于的前缀,然后操作前一个前缀,这样前边变有序后,与当前数成逆序对一定是个后缀,然后根据需要选任意个即可 所以我们对任意方案构造出了 \(= 2\) 的解 …...

题解:P12558 [UOI 2024] Heroes and Monsters

题面: (这个没交洛谷,给学弟写的。) \(O(n^3)\) 考虑直接求出所有 \(ans_i\),前缀和回答询问。 \(a,b\) 先排序。由于我们只关心英雄的集合,所以怪兽我们贪心选择,如果我们选这个英雄那么选最前面的怪兽,否则选后面第一个能打死自己的怪兽。显然,合法方案怪兽的前缀会…...

数据分析与产品、运营、市场之间如何有效对齐 - 详解

数据分析与产品、运营、市场之间如何有效对齐 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monosp…...

(附源码)基于Java的学生托管系统的设计与实现 - 实践

(附源码)基于Java的学生托管系统的设计与实现 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mono…...

SVG动画优化全攻略:从设计到性能提升

本文详细介绍了如何通过清洁设计、路径简化、代码分层和元素复用等技术优化SVG动画,涵盖工具选择、结构设计到CSS动画实现的全流程,帮助开发者创建高性能的SVG动画效果。粉碎动画第四部分:优化SVG SVG动画让我回想起童年观看的汉纳-巴伯拉卡通片。像《Wacky Races》、《The …...

【GitHub每日速递 250919】MCP 生态新工具!Registry 服务器注册服务预览版,AI 开发者部署认证全流程揭秘

原文:https://mp.weixin.qq.com/s/vpm5exQj1imATtK6edQjZA gRPC-Go:高性能开源RPC框架,使用攻略及常见问题全解析 [grpc-go] 是一个基于 HTTP/2 的高性能远程过程调用(RPC)框架的 Go 语言实现。简单讲,它让不同服务能高效地通过网络互相调用函数。适用人群:Go 语言开发者…...

多元积性函数

定义:若函数 \(f(n,m)\) 满足 \(ab \perp xy \Rightarrow f(ax,by)=f(a,b)f(x,y)\),则称 \(f\) 为二元积性函数。 积性分解:将 \(x=\prod p_i^{\alpha _i},y=\prod p_i^{\beta _i}\),则有 \(f(x,y)=\prod f(p_i^{\alpha_i},p_i^{\beta_i})\)。 二元迪利克雷卷积:\((f*g)(n…...

MX 练石 2026 NOIP #7

好难好难好难好难,为数不多的罚坐了。MX 练石 2025 NOIP #6 链接:link 题解:link 时间:4h20min (2025.09.18 13:50~18:10) 题目数:4 难度:A B C D估分:50 + 10 + 10 + 10 = 80 得分:场祭 读题。 开 A,发现可以转化为 \(a_i - i \le a_j - j \land b_i - i \ge b_j - j…...

用Qt打造永远运行的程序/守护进程/程序启动器/实时监测程序运行/后台运行

一、前言说明 最近有个定制需求,希望程序能够一直运行,比如在windows上运行的程序,很可能无法保证不出故障崩溃,有时候可能是程序内部处理异常导致的崩溃,比如有些数据解析没有考虑到一些极端的情况,还有就是用户主动关闭了程序,可能是误关闭,而有些程序,又必须7*24小…...

传话游戏 题解

详细揭秘传话游戏 题解 题目描述 初始时你有一个长度为 \(m\) 的字符串 $ S_1 $ ,然后你可以进行 $ n-1 $ 次操作,每次操作修改当前字符串,形如删掉其中某些元素(可以全删,也可以都不删)。第 \(i\) 次操作得到的字符串记为 $ S_{i+1} $ ,这样得到了由 \(n\) 的字符串形成…...

智驾芯片三强对决:征程6P vs EyeQ Ultra vs Thor

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087智能驾驶芯片是自动驾驶技术的「中枢神经」,其性能直接关乎车辆感知决策的精准度与响应速度。当前,全球智驾芯片市场呈现多元…...

0132_访问者模式(Visitor)

访问者模式(Visitor) 意图 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 UML 图优点开闭原则:容易添加新的访问者操作,无需修改元素类 单一职责原则:将相关行为集中到一个访问者对象中 灵活性:可以在运行…...

国内AI云市场:挤不进前三,生存将成问题!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087中国AI云市场已形成“一大四强”的格局,阿里云以35.8%的份额独占鳌头,而第五名之后的厂商合计市场份额不足25%,在残酷的竞争…...

P14053 [SDCPC 2019] Median 题解

P14053 [SDCPC 2019] Median 题解P14053 [SDCPC 2019] Median 题解 一道水题。 观察题意,很快我们可以发现,对于元素 \(i\),其合不合法取决于一定大于 \(i\) 的数的个数与一定小于 \(i\) 的数的个数。 这时,我们只需要统计有多少数大于 \(i\),与多少数小于 \(i\) 即可。 只…...

lQueryDef查询Evaluate报该几何不包含M值问题。

地理数据库既包括空间,又包括属性,属性类似于SQL表,理论上支持标准SQL查询。lQueryDef接口提供了高效查询方法,适用于对属性表或要素类的属性进行筛选和检索。 问题描述 一个简单的面积求和示例如下:IQueryDefFactory queryDefFactory = (IQueryDefFactory)workspace; IQu…...

我的首个RCE漏洞发现之旅:Apache ActiveMQ远程代码执行实战

本文详细讲述了作者如何通过系统化的子域名枚举和端口扫描,发现Apache ActiveMQ的CVE-2023-46604远程代码执行漏洞的全过程,包含具体的工具使用方法和实战技巧。我的首个RCE漏洞发现经历 大家好!在这篇文章中,我将分享我的第一个远程代码执行(RCE)漏洞发现经历。这次漏洞…...

北京市社保费用差额补缴计算工具

北京市社保费用差额补缴计算工具9月18日北京市发布了社会保险缴费工资基数上下限调整的通告,自2025年7月起,社保基数下限由原来的 6821元提高到7162元。 这样一来,之前已经缴了7月份社保且社保基数不到7162元的就需要补缴了。 根据我缴社保时看到的数据,我写了一个北京市社…...

使用自签名SSL证书有什么风险?

自签名SSL证书,指的是由用户自行生成密钥对并予以签名的证书,无需经由第三方权威证书颁发机构(CA)审核。鉴于其具备零成本、生成便捷的特性,该证书常被应用于个人测试、内部临时服务等非生产场景。 然而,相较于权威CA颁发的IP SSL证书,自签名证书在信任机制、安全性、兼…...

CDN可以使用iTrustSSL通配符证书吗?

CDN,即内容分发网络,它是一种通过在多个地理位置分散部署服务器节点,将网站的内容缓存并分发到离用户最近的节点上,从而显著提高网站内容的访问速度、降低延迟,并减轻源服务器负载的技术架构。借助CDN,网站能够更快地响应用户的请求,为用户提供流畅的浏览体验。而SSL证书…...

OpenCvSharp基于颜色反差规避FBA面单贴标

01 规避原理 1.抠图,根据色差或者根据固定包裹位置以及包裹尺寸抠出纸箱图片 2.色差,获取纸箱上所有背景色的灰度值 3.采图,采集大量视野相同,光源相同面单的色差灰度值,整理区间 4.取反,所有非面单灰度值区间的,都认为是纸箱背景色 02根据DPI计算1mm对应像素点。获取吸…...

【API接口】最新可用手机号归属地查询接口

最新可用手机号归属地查询接口,查询手机号码归属地、所属号段、手机卡类型、运营商等信息 使用之前您需要先去注册下key 申请地址: https://www.52api.cn 接口地址:https://www.52api.cn/api/mobile_location 返回格式:application/json 请求方式:GET/POST 请求示例:htt…...

【API接口】最新可用IP地址查询接口

最新可用IP地址查询接口,精准定位IPV4地址的地理位置信息,包括国家、城市、地区、运营商等详细数据,内置双线路来确保数据可用性 使用之前您需要先去注册下key 申请地址: https://www.52api.cn 接口地址:https://www.52api.cn/api/ip_query 返回格式:application/json 请…...

UE5创建的对象无法用ai操控

UE5创建的对象无法用ai操控记得更改这个设置...

【API接口】最新可用喜马拉雅接口

最新可用番茄畅听接口,支持搜索、详情解析、音频链接解析功能,助您快速构建您的专属听书客户端 使用之前您需要先去注册下key 申请地址: https://www.52api.cn 接口地址:https://www.52api.cn/api/xmly 返回格式:application/json 请求方式:GET/POST 请求示例:https://…...

25/09/18 小结

第三期ccb CF519E 2100 虽然是一道2100的题,但还是比较好想的。在树上找到最短距离,明显需要用到公共祖先之类的算法,并且,还要明确的知道节点往上走几步会到哪个节点。因此,学习了dfn序求LCA的方法。 具体来说在dfs序中,两个节点之间的dfn一定会遍历到lca的儿子节点,而…...

【API接口】最新可用番茄畅听接口

最新可用番茄畅听接口,支持搜索、详情解析、音频链接解析功能,助您快速构建您的专属听书客户端 使用之前您需要先去注册下key 申请地址: https://www.52api.cn 接口地址:https://www.52api.cn/api/fanqie_ct 返回格式:application/json 请求方式:GET/POST 请求示例:htt…...

【API接口】最新可用七猫短剧接口

最新可用七猫短剧接口,支持短剧搜索、短剧详情解析、短剧播放链接解析功能,助您快速构建您的专属短剧客户端 使用之前您需要先去注册下key 申请地址: https://www.52api.cn 接口地址:https://www.52api.cn/api/qm_duanju 返回格式:application/json 请求方式:GET/POST 请…...

磁盘分析工具推荐(Wiztree)

前言 磁盘空间占满了真难受,但是又像仓鼠一样不愿意删除,怎么找到有效的办法呢? (买买买!只要磁盘够大,都不是问题!) 但是买买买也是有上限的(除非你一直用机械硬盘去备份保存,物理存储) 所以还是需要删除文件的 那么,问题来了,怎么删除更有效呢? 那当然是,删除…...

用FastAPI和Streamlit实现一个ChatBot

用FastAPI+Streamlit实现一个流式响应的ChatBot前言 本文使用FastAPI+Streamlit实现一个流式响应类ChatGPT的LLM应用,这里只是一个demo,后续会基于此实现一个完整的MCP Client + MCP Server的MCP应用。 Streamlit是专为机器学习和数据科学项目打造的开源Python库,它允许开发…...

搜索百科(2):Apache Solr — 企业级搜索的开源先锋

大家好,我是 INFINI Labs 的石阳。 欢迎回到 《搜索百科》 专栏!每天 5 分钟,带你速览一款搜索相关的技术或产品,同时还会带你探索它们背后的技术原理、发展故事及上手体验等。 上一篇我们认识了搜索技术的基石 Apache Lucene,今天我们将继续这个旅程,了解基于 Lucene 构…...

Markbook Day03

如何打开CMDWindows+系统+终端右键+在终端打开Windows+R,输入CMD打开某个盘,在地址前输入cmd空格,然后回车 选择以管理员方式运行常用DOS命令 盘符切换 查看当前目录下所有文件dir 切换目录cd change directory cd..回到上一个...

re分区为y盘,efi分区为z盘

re分区为y盘,efi分区为z盘...

数组,java学习第五天

数组 数组的定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们,数组的下标是从0开始的 数组声明创建、三种初始化及内存分析 首先必须声明数组…...

文件结构与数据分析专项-解析

在https://exam.didctf.com/practice/questions可以找到题目出这套题主要是想鼓励大家在遇到陌生的文件时,可以主动地去对这类文件进行分析(尤其是将多个文件打包在一起),希望能通过专项练习得到这方面的提升。 源码 这边先给出源码,先是main.go package mainimport (&quo…...

销售能力——Steam平台我们应该做什么游戏?

最近刚看一个视频,李亚鹏卖酒的故事挺有意思,分享一下 https://www.bilibili.com/video/BV1CXkuY2EXk/?spm_id_from=333.1391.0.0&vd_source=106601ca71b1d910c1ac4aa2466b744c 这里李亚鹏卖酒卖不出去,和我们独立游戏作者游戏卖不出去,我觉得是一个原理。 就是完全没…...

平静

也许我该试着让自己的心灵安静下来。 隐入世俗的境地,好好和身边的人聊聊天。 从合租的房子里搬出去,自己一个人独居。如此渴望孤独的星空,又渴望与群星作伴。...

2025.9.18总结

内容:回顾web学习路线 从最开始的1.黑框增删改查 2.连上数据库,但依旧黑框增删改查 3.网页界面增删改查 4.使用springboot+vue3增删改查。 现在回头看使用ai能够轻松的完成一个表的小项目。 不过对于存粹的技术上面没有掌握更多的知识。打算看一看苍穹外卖看一看除增删改查。…...