鸿蒙UI开发快速入门 —— part12: 渲染控制

news2024/11/27 11:43:15

 如果你对鸿蒙开发感兴趣,加入Harmony自习室吧~👇🏻👇🏻👇🏻👇🏻

扫描下面的二维码关注公众号。

图片

1、前言

在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句来辅助UI的构建,这些渲染控制语句包括控制组件是否显示的条件渲染语句,基于数组数据快速生成组件的循环渲染语句。

2、条件渲染

假设我们存在这样一个应用场景:当我们的界面在满足某种条件时,需要显示一些组件,在不满足某些条件时,不显示某些组件(比如登录注册时的错误提示)。

举例:在下面的案例中,数字为偶数时,我们需要提示一个红色的文字,否则不显示红色的文字。

图片

此时,我们就需要用到鸿蒙提供的条件渲染。ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。

使用规则如下:

  • 支持if、else和else if语句。

  • if、else if后跟随的条件语句可以使用状态变量。

  • 允许在容器组件内使用,通过条件渲染语句构建不同的子组件。

  • 条件渲染语句在涉及到组件的父子关系时是“透明”的,当父组件和子组件之间存在一个或多个if语句时,必须遵守父组件关于子组件使用的规则。

  • 每个分支内部的构建函数必须遵循构建函数的规则,并创建一个或多个组件。无法创建组件的空构建函数会产生语法错误。

  • 某些容器组件限制子组件的类型或数量,将条件渲染语句用于这些组件内时,这些限制将同样应用于条件渲染语句内创建的组件。例如,Grid容器组件的子组件仅支持GridItem组件,在Grid内使用条件渲染语句时,条件渲染语句内仅允许使用GridItem组件。

if条件渲染与我们通常写的逻辑if、else、else if保持一致。本小节中举例的使用代码如下:

@Entry@Componentstruct Index {  @State num: number = 1;  build() {    Row() {    Column({ space: 15 }) {        Text(`当前数字: ${this.num}`)        Button('将数字+1')          .onClick(() => this.num++);      // 偶数      if(this.num % 2 === 0) {        Text('当前输入的数字是偶数!')          .fontColor(Color.Red)      }      }.width('100%')    }.height('100%')  }}

代码中,this.num % 2 === 0表示是偶数,在遇到偶数时,if条件成立,最终显示'当前输入的数字是偶数!'提示,否则提示消失。

3、循环渲染

ForEach接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。

3.1、 接口描述

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

arr:必填,是需要渲染的组件的数据源。

itemGenerator:必填,是组件生成函数。

keyGenerator: 可选,是键值生成函数(确定唯一性)

在ForEach循环渲染过程中,系统会为每个数组元素生成一个唯一且持久的键值,用于标识对应的组件。当这个键值变化时,ArkUI框架将视为该数组元素已被替换或修改,并会基于新的键值创建一个新的组件。

ArkUI框架对于ForEach的键值生成有一套特定的判断规则,这主要与itemGenerator函数的第二个参数index以及keyGenerator函数的第二个参数index有关,具体的键值生成规则判断逻辑如下图所示。

图1 ForEach键值生成规则

图片

3.2、 Demo如下

我们创建一个数组,然后将数组中的内容使用Text()分别展示出来

图片

@Entry@Componentstruct Index {  @State simpleList: Array<string> = ['one', 'two', 'three', 'four', 'five'];  build() {    Row() {      Column() {        ForEach(this.simpleList, (item: string, idx: number) => {          ChildItem({ 'item': `${idx+1}.${item}` } as Record<string, string>)        })      }      .alignItems(HorizontalAlign.Start)      .padding(10)      .width('100%')      .height('100%')    }    .height('100%')    .backgroundColor(0xF1F3F5)  }}@Componentstruct ChildItem {  @Prop item: string;  build() {    Text(this.item)      .fontSize(50)      .margin({        bottom: 10      })  }}

3.3、 需要注意的keyGenerator

我们如果要复写keyGenerator,一定要保证其生成的值与实际的业务是严格对应关系,否则,keyGenerator函数如果生成有重复(不同的业务场景对应相同的key),则可能导致渲染异常问题。

举例,假设我们有个列表,用于显示数组中的所有字符串,如果我们复写了keyGenerator,使用其字符串内容作为key。示意如下:

图片

4、结语

至此,我们的“鸿蒙UI开发快速入门系列”正式结束了!

接下来,我们将围绕UI开发的一些细节做展开,例如:学习ArkUI提供的所有布局方式、学习系统的常用控件、UI动画等。

请持续关注后续“鸿蒙UI开发系列”。

如果你对鸿蒙开发感兴趣,加入Harmony自习室吧~👇🏻👇🏻👇🏻👇🏻

扫描下面的二维码关注公众号。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1874579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1panel 搭建多个网站

1panel 部署多个网站&#xff0c;另外的域名&#xff0c;或无域端口搭建方法。 当我们已经部署好一个网站后&#xff0c;想再部署一个网站在我们的服务器上时&#xff0c; 步骤&#xff1a;&#xff08;另外的域名&#xff0c;部署在同一个服务器方法&#xff09; 运行环境里…

virtualbox安装win10

等到安装完成 设备下选择安装增强功能

构造函数的小白理解

一、实例 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;//定义一个名为Question的类&#xff0c;用于存储问题及相关信息 [Serializable] public class Question {public string questionText;//存储题目文本字段public str…

中小企业数字化转型如何选择适合自己的MES系统?

随着信息技术的飞速发展&#xff0c;数字化转型已成为中小企业提升竞争力、实现可持续发展的关键途径。在数字化转型过程中&#xff0c;制造执行系统&#xff08;MES&#xff09;作为连接企业资源计划&#xff08;ERP&#xff09;与车间现场管理的桥梁&#xff0c;扮演着至关重…

Docker部署前端,动态配置后端地址

本文介绍了使用Docker环境变量动态配置nginx。采用的是通过docker run -e xxxxxxx先往容器注入环境变量&#xff0c;然后进一步通过envsubst指令将环境变量写入到conf文件中&#xff0c;实现动态配置文件内容。 背景 前后端分离的架构下&#xff0c;经常会用到nginx反向代理来…

并发编程基础概念

相关概念 并行 并行是指同一个时刻&#xff0c;多个任务同时进行。只有在多核CPU下才会发生。 并发 并发是指单个CPU在不同任务之间来换切换工作&#xff0c;但是同一时刻只有一个任务在工作。由于CPU的切换速度很快&#xff0c;给人的感受是多个任务在一起运行。 串行 串行…

程序员敲代码的习惯你占几样撒?

IT行业的科技公司们一直苦苦追寻传说中以一当十的超级程序员&#xff0c;最新的研究表明确实存在这样一小撮效率奇高的“程序金刚”&#xff0c;但是一位普通程序猿如何能够蜕变成代码金刚呢&#xff1f; 国内外的各大专家总结了导致程序猿效率低下&#xff0c;代码为什么像坨s…

制造业包括哪些?需要堡垒机吗?

制造业-国民经济的主体&#xff0c;是立国之本、兴国之器、强国之基&#xff0c;一个关系着大家吃穿住行的行业&#xff0c;一个与大家息息相关的行业。但大家对于制造业还有很多不了解&#xff0c;有小伙伴在问&#xff0c;制造业包括哪些&#xff1f;需要堡垒机吗&#xff1f…

在创意设计领域“刷屏”的人工智能生成内容(AIGC)是什么?

在创意设计领域“刷屏”的人工智能生成内容&#xff08;AIGC&#xff09;是什么&#xff1f;这是一个值得深入探讨的话题&#xff0c;它关乎技术的革新、创意的边界以及未来设计行业的走向。随着人工智能技术的飞速发展&#xff0c;AIGC&#xff08;Artificial Intelligence Ge…

小米大模型提效新框架:训练最高提速34%,推理最高提速52%!Kaldi之父合作出品

大模型推理速度提升50%以上&#xff0c;还能保证少样本学习性能&#xff01; 小米大模型团队提出SUBLLM&#xff08;Subsampling-Upsampling-Bypass Large Language Model&#xff09;&#xff0c;国际AI语音大牛、开源语音识别工具Kaldi之父Daniel Povey也参与指导。 与Llam…

【学习笔记】爱立信SPO 1400 CRAFT软件基础知识4——图形用户界面之通知列表和状态栏

一、前期准备 提示&#xff1a;下面所有学习内容都是基于以下条件完成的 条件1.已经正确安装并正常运行SPO 1400 CRAFT软件&#xff08;以下简称LCT&#xff09; 条件2.确认已正确使用爱立信SPO 1400 CRAFT软件通过网络登录设备&#xff08;以下简称NE&#xff09; 具体登录…

大数据学习之分布式数据采集系统Flume学习

分布式数据采集系统Flume学习 一、Flume架构 1.1 Hadoop业务开发流程 1.2 Flume概述 flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。 支持在日志系统中定制各类数据发送方&#xff0c;用于收集数据; 同时&#xff0c;Flume提供对数据进行简单处理&…

怎么在线电脑上做图片二维码?在线3步图片转活码的制作方法

图片怎么才能做成二维码展示呢&#xff1f;图片生成二维码的方式能够在手机上查看图片&#xff0c;有利于图片的快速分享&#xff0c;通过这种方法能够减少对内存的占用&#xff0c;也提高了用户获取图片的便利性。通过生成图片活码能够不断提供最新的图片给用户展示&#xff0…

某山词霸翻译js逆向分析

一、基础知识 1、post的几种发包的方式 2、query string和form data的区别 Query String Parameters&#xff1a; GET请求时&#xff0c;参数会以url string 的形式进行传递&#xff0c;即?后的字符串则为其请求参数&#xff0c;并以&作为分隔符。&#xff08;有时候pos…

RocketMQ快速入门:linux安装rocketmq并配置开机自启(十一)

目录 0. 引言1. 下载安装包1.1 高版本直接下载安装包1.2 下载源码包进行编译 2. namesrv和broker安装2.1 安装2.2 放开服务器端口2.3 测试 3. 配置开机自启3.1 配置namesrv开机自启3.2 配置broker开机自启 0. 引言 之前我们针对本机电脑安装rocketmq进行了讲解&#xff0c;同时…

营销翻车,杜国楹出面道歉,小罐茶的“大师作”故事仓皇结尾

“小罐茶&#xff0c;大师作”&#xff0c;这句slogan曾一度在央视平台长时间、高密度播放&#xff0c;成为家喻户晓的广告词&#xff0c;也打响了小罐茶品牌的名号。但同时&#xff0c;市场上关于“大师作”真实性的质疑也从未停息。 就在6月25日小罐茶十二周年发布会上&#…

页分裂和页合并——Java全栈知识(33)

上篇文章我们讲到了 MySQL 的数据页&#xff0c;我们说到了 InnoDB 的索引是以 B树的形式构建的&#xff0c;而且 B树的节点都是一个数据页。 但是 B树在使用过程中难免会有节点分裂和节点合并的过程。 因为我们是以数据页为基本单位构造的 B树&#xff0c;那么 B树的节点分裂和…

django —— 搭建项目及简单测试

打开Pycharm编辑器 新建项目 File -> New Project 创建应用管理 -> myapp 打开终端输入 python38 manage.py startapp myapp 执行后会在项目下自动生成myapp文佳夹 把myapp配置到settings.py中 在settings.py文佳INSTALLED_APPS 中输入 在views.py中编写业务接口 把…

云计算:重塑数字时代的基石

目录 一、引言 二、云计算的定义与特点 三、云计算的发展历程 四、云计算的应用场景 五、云计算面临的挑战 六、云计算的未来发展趋势 七、结语 一、引言 随着信息技术的飞速发展&#xff0c;云计算已经逐渐渗透到我们生活的方方面面。从个人用户的在线存储、在线办公&…

昇思25天学习打卡营第5天|数据变换 Transforms

昇思25天学习打卡营第5天|数据变换Transforms 前言数据变换 TransformsCommon TransformsCompose Vision TransformsRescaleNormalizeHWC2CHW Text TransformsPythonTokenizerLookup Lambda Transforms 个人任务打卡&#xff08;读者请忽略&#xff09;个人理解与总结 前言 非常…