首页/新闻资讯/正文详情

HarmonyOS开发实战:笔友-条件渲染与可见性控制:if/Visibility 对比

发布时间:2026/11/14 0:36:13 来源:云帆数科 栏目:资讯中心
HarmonyOS开发实战:笔友-条件渲染与可见性控制:if/Visibility 对比
前言在 ArkUI 声明式开发范式中条件渲染和可见性控制是两种不同的 UI 控制策略。if/else通过条件判断决定是否创建组件而Visibility通过控制组件的可见性属性决定是否显示。它们各有适用场景错误的选择可能导致性能问题或状态丢失。本文将以开源鸿蒙笔友通信应用 xiexin 的SplashPage.ets、Index.ets、ComposePage.ets为蓝本详细剖析if/else和Visibility的语义、差异、性能对比以及它们在不同场景下的最佳实践。提示本文假设你已经了解 ArkUI 声明式开发的基本概念。如果还不熟悉建议先阅读前十七篇文章。一、条件渲染的两种方式1.1 if/else 条件渲染if/else通过条件判断决定是否创建组件// SplashPage.ets — if/else 切换按钮if(this.currentPage2){Button(开始写信).fontSize(16).fontColor(AppColors.WHITE).backgroundColor(AppColors.PRIMARY).borderRadius(24).width(200).height(48).onClick((){router.replaceUrl({url:pages/Index});})}else{Button(下一步).fontSize(16).fontColor(AppColors.PRIMARY).backgroundColor(AppColors.AMBER_LIGHT).borderRadius(24).width(200).height(48).onClick((){this.currentPagethis.currentPage1;})}1.2 Visibility 可见性控制Visibility通过属性控制组件是否可见// Visibility 的三种状态Visibility.None// 完全不可见不占布局空间Visibility.Hidden// 不可见但保留布局占位Visibility.Visible// 可见// 使用示例Text(隐藏文字).visibility(Visibility.Hidden)二、if/else 与 Visibility 的核心差异2.1 对比表格维度if/elseVisibility组件创建条件为 true 时创建始终创建内存占用条件为 false 时不占用始终占用内存布局空间条件为 false 时不占布局None不占Hidden占位状态保留条件变化时销毁重建状态丢失状态始终保留适用场景不常切换、内容较多频繁切换、内容较少性能开销创建/销毁有开销始终存在无切换开销2.2 选择决策树组件是否需要频繁切换显示/隐藏 ├── 是 → Visibility │ 组件是否需要保留状态 │ ├── 是 → Visibility.Hidden保留占位 │ └── 否 → Visibility.None不占布局 └── 否 → if/else 组件内容是否较多 ├── 是 → if/else减少内存占用 └── 否 → if/else默认选择三、xiexin 中的条件渲染3.1 SplashPage 的按钮切换// SplashPage.ets — 使用 if/else 切换按钮if(this.currentPage2){Button(开始写信).fontSize(16).fontColor(AppColors.WHITE).backgroundColor(AppColors.PRIMARY).borderRadius(24).width(200).height(48).fontWeight(FontWeight.Medium).onClick((){router.replaceUrl({url:pages/Index});})}else{Button(下一步).fontSize(16).fontColor(AppColors.PRIMARY).backgroundColor(AppColors.AMBER_LIGHT).borderRadius(24).width(200).height(48).fontWeight(FontWeight.Medium).onClick((){this.currentPagethis.currentPage1;})}这里使用if/else是正确的选择因为切换频率低用户只会在引导页翻页时切换一次组件内容少按钮只有 10 行代码创建/销毁开销小状态不保留切换按钮时不需要保留上一个按钮的状态3.2 Index 页面的空状态判断// Index.ets — 使用 if/else 判断空状态if(this.letters.length0){EmptyState({title:还没有信件去写第一封吧,subtitle:每一封信都是一段温暖的旅程})}else{Scroll(){Column({space:12}){ForEach(this.getSortedLetters(),(letter:Letter){this.LetterCard(letter)},(letter:Letter)letter.id.toString())}.padding({left:16,right:16,bottom:20})}.layoutWeight(1).scrollBar(BarState.Off)}这里使用if/else是正确的选择因为切换频率低从空状态到有信件只切换一次内容差异大空状态和信件列表的 UI 完全不同内存优化空状态时不会创建 100 个 ListItem 组件3.3 ComposePage 的面板展开// ComposePage.ets — 使用 State 布尔值控制面板展开StateshowHonorificPanel:booleanfalse;StateshowGreetingPanel:booleanfalse;StateshowClosingPanel:booleanfalse;StateshowWordPanel:booleanfalse;StateshowPaperPanel:booleanfalse;StateshowFormatPanel:booleanfalse;// 在 build 中使用 if 条件渲染if(this.showHonorificPanel){this.HonorificPanel()}if(this.showGreetingPanel){this.GreetingPanel()}这里使用if条件渲染但应该考虑Visibility的优化// 优化使用 Visibility 保留面板展开时的滚动位置HonorificPanel().visibility(this.showHonorificPanel?Visibility.Visible:Visibility.None)四、if/else 的常见陷阱4.1 状态丢失// 问题if/else 切换时子组件状态丢失EntryComponentstruct MyComponent{StateshowInput:booleanfalse;build(){Column(){if(this.showInput){TextInput({placeholder:输入内容})}Button(切换).onClick((){this.showInput!this.showInput;})}}}当showInput从true变为false再变为true时TextInput组件被销毁重建用户输入的内容丢失。4.2 动画中断// 问题if/else 切换时动画被中断if(this.isVisible){Text(Hello).opacity(1).animation({duration:300})}else{// 组件不存在动画无法播放}4.3 性能问题// 问题频繁切换时if/else 导致大量创建/销毁if(this.isVisible){ForEach(this.largeArray,(item){// 大量组件},(item)item.id.toString())}五、Visibility 的常见陷阱5.1 布局空间问题// Visibility.Hidden 保留布局空间Column(){Text(标题).visibility(Visibility.Hidden)// 标题不可见但占位还在Text(内容)}5.2 与动画的配合// 使用 opacity 实现平滑过渡StateisVisible:booleanfalse;Text(Hello).opacity(this.isVisible?1:0).animation({duration:300,curve:Curve.EaseOut})六、if/else 与 Visibility 的配合使用6.1 组合策略// 组合使用if/else 控制创建Visibility 控制显示StateisComponentCreated:booleanfalse;StateisComponentVisible:booleanfalse;if(this.isComponentCreated){Text(Hello).visibility(this.isComponentVisible?Visibility.Visible:Visibility.Hidden)}6.2 实际应用// 场景弹窗的创建和显示StateisDialogCreated:booleanfalse;StateisDialogVisible:booleanfalse;// 创建弹窗仅一次if(this.isDialogCreated){CustomDialog({visible:this.isDialogVisible,onClose:(){this.isDialogVisiblefalse;}})}// 显示/隐藏弹窗多次切换Button(显示弹窗).onClick((){this.isDialogCreatedtrue;this.isDialogVisibletrue;})七、xiexin 中的可见性控制优化7.1 当前实现xiexin 当前主要使用if/else进行条件渲染// SplashPage: if/else 切换按钮if(this.currentPage2){/* 开始写信按钮 */}else{/* 下一步按钮 */}// Index: if/else 判断空状态if(this.letters.length0){/* 空状态 */}else{/* 信件列表 */}// ComposePage: if 控制面板展开if(this.showHonorificPanel){/* 称谓面板 */}7.2 优化建议当前位置当前方式建议方式理由SplashPage 按钮if/else保持 if/else切换频率低内容简单Index 空状态if/else保持 if/else内容差异大内存优化ComposePage 面板if改为 Visibility面板切换频繁需保留状态八、条件渲染的性能对比8.1 创建/销毁开销对比项if/elseVisibility首次创建需要创建需要创建条件变化销毁重建不需要创建多次切换每次创建/销毁无额外开销8.2 内存占用对比项if/elseVisibility条件为 false不占用内存占用内存条件为 true占用内存占用内存1000 项列表仅创建 1000 项始终创建 1000 项九、Visibility 与动画的配合9.1 淡入淡出效果EntryComponentstruct FadeExample{StateisVisible:booleanfalse;build(){Column(){Text(Hello).opacity(this.isVisible?1:0).animation({duration:300,curve:Curve.EaseOut})Button(切换).onClick((){this.isVisible!this.isVisible;})}}}9.2 滑动展开效果EntryComponentstruct SlideExample{StateisExpanded:booleanfalse;build(){Column(){Button(展开).onClick((){animateTo({duration:300},(){this.isExpanded!this.isExpanded;})})// 使用 if 控制创建动画控制显示if(this.isExpanded){Text(内容).opacity(1).animation({duration:300})}}}}十、从 xiexin 看条件渲染与可见性控制xiexin 中条件渲染的使用体现了场景决定选择的原则引导页按钮切换使用if/else因为切换频率低、内容简单空状态判断使用if/else因为内容差异大、内存占用差别大编辑面板展开使用if实际上应该用Visibility因为切换频繁、需要保留状态每个场景的选择都基于实际的业务需求而非盲目使用某一种方式。总结本文详细剖析了 HarmonyOS ArkUI 的if/else条件渲染和Visibility可见性控制的语义、差异、性能对比以及它们在不同场景下的最佳实践。理解条件渲染与可见性控制的关键是把握两个原则创建原则if/else 决定是否创建和显示原则Visibility 决定是否显示。创建原则适用于不常切换、内容较多的场景显示原则适用于频繁切换、需要保留状态的场景。至此我们已经完成了 HarmonyOS 应用开发实战系列的第二阶段——ArkUI 声明式 UI 进阶。从下一篇文章开始我们将进入第三阶段——组件化与通用组件深入剖析 xiexin 中如何通过组件封装实现 UI 复用。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netHarmonyOS 渲染控制概述https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-overviewHarmonyOS if/else 条件渲染https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-ifHarmonyOS ForEach 渲染控制https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-foreachHarmonyOS LazyForEach 渲染控制https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-lazyforeachHarmonyOS 高性能编程实践https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-high-performance-programmingHarmonyOS 动画概述https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-animationHarmonyOS 状态管理概述https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state-management-overviewHarmonyOS 自定义组件https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-custom-components

相关推荐

Linux进程基础与fork()机制详解
Linux进程基础与fork()机制详解

1. Linux进程基础概念解析在Linux系统中,进程是操作系统资源分配和调度的基本单位。每个运行中的程序都会创建一个或多个进程,它们拥有独立的地址空间和系统资源。理解进程的运作机制,是掌握Linux系统编程和性能优化的基础。进程与程序的区别… · 2026/10/20 11:36:34

Rancher与Kubernetes多集群管理实战指南
Rancher与Kubernetes多集群管理实战指南

1. Rancher与Kubernetes管理现状解析在容器编排领域摸爬滚打多年,我见证了不少团队从手工管理Docker容器到全面拥抱Kubernetes的转型过程。但真正把k8s集群管好、用活,远不是敲几条kubectl命令那么简单。特别是在多集群、混合云场景下,原生Ku… · 2026/11/14 0:36:12

科技行业调整期开发者技能升级与职业发展指南
科技行业调整期开发者技能升级与职业发展指南

最近一段时间,科技圈出现了一个值得开发者关注的现象:多家大型科技公司相继公布了不太理想的财报数据。这种"集体失血"的状况,不仅反映了当前宏观经济环境的变化,更预示着技术行业可能进入一个新的调整周期。对于一线开… · 2026/10/24 9:02:25

有电工证能当什么兵 官方回应特种作业证的重要性与报考指南
有电工证能当什么兵 官方回应特种作业证的重要性与报考指南

有电工证能当什么兵 官方回应特种作业证的重要性与报考指南 你是不是也遇到过这种情况:拿着电工证,却找不到合适的工作?明明有证在手,却还是被用人单位拒之门外?其实, 电工证 不是万能的,但 没有电工证是万万不能的… · 2026/11/14 0:35:18

秭归哪里可以考电工证官方报名入口怎么找
秭归哪里可以考电工证官方报名入口怎么找

秭归哪里可以考电工证官方报名入口怎么找 实操考试心里没底怕挂科,这是很多准备在秭归考电工证的朋友的共同困扰。尤其是像河南水利工程从业者,工作中需要用到电力设备、电缆、开关等,没有电工证就无法上岗,更别提晋升了。如果你正在找【秭归哪里可以考电… · 2026/11/14 0:35:18

黄岛电工证好考吗通过率揭秘:房建从业者怎么选证更划算
黄岛电工证好考吗通过率揭秘:房建从业者怎么选证更划算

黄岛电工证好考吗通过率揭秘:房建从业者怎么选证更划算 你是不是也正被“急需特种作业证才能上岗找工作”这个问题折磨?特种作业证不仅影响你能不能入职,还关系到你后续的晋升空间和薪资待遇。尤其是像 黄岛电工证… · 2026/11/14 0:35:18

工地太忙根本没时间复习考试?好口碑的电工证样本培训有良心建议
工地太忙根本没时间复习考试?好口碑的电工证样本培训有良心建议

工地太忙根本没时间复习考试?好口碑的电工证样本培训有良心建议 工地太忙根本没时间复习考试,很多人一听到要考电工证就头大,想着自己每天忙得连饭都顾不上吃,哪还有时间去上课、做题、复习?其实,这事儿不难,关键在于怎么选… · 2026/11/14 0:35:18

福山区考电工证怎么报?学历不高怕报不上名?电子证书帮你解决
福山区考电工证怎么报?学历不高怕报不上名?电子证书帮你解决

福山区考电工证怎么报?学历不高怕报不上名?电子证书帮你解决 学历不高怕报不上名?其实福山区考电工证门槛并不高,关键是你得知道怎么走流程,选对渠道。很多刚入行的工人,尤其是来自农村或没有学历的学员,总担心自己“没文化”、“没文凭”就考不了证,… · 2026/11/14 0:35:18

忠县电工证在哪里办全流程指南 3个实操细节帮你稳过考试
忠县电工证在哪里办全流程指南 3个实操细节帮你稳过考试

忠县电工证在哪里办全流程指南 3个实操细节帮你稳过考试 实操考试心里没底怕挂科?忠县电工证在哪考?这事儿别瞎折腾,老电工都懂,一招一式都讲究,一步错就可能白忙活。尤其是像你这种准备转岗或刚入行的,别以为报名点随便找个就行,还得看准地方、看准… · 2026/11/14 0:34:18

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/13 22:30:50

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/13 5:40:45

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/12 23:27:43

有初级电工证怎么工作 2026河南最新政策怎么应对
有初级电工证怎么工作 2026河南最新政策怎么应对

有初级电工证怎么工作 2026河南最新政策怎么应对 之前考的证在外省能不能转过来?这个问题我每天被问上百次。2026年河南最新政策对证书跨省转移有了明确说明,特别是南阳市的从业者,需要特别关注。… · 2026/11/14 0:00:31

电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略
电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略

电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 证书过期了不知道怎么复审延期?很多人遇到这种情况,要么是工作太忙没时间处理,要么是不知道具体流程,导致证书失效,影响工作和项目进展。其实复审并不难,关键是要找准官方报名入口,掌… · 2026/11/14 0:00:31

为什么要低压电工证实操考试考什么
为什么要低压电工证实操考试考什么

为什么低压电工证值不值得考?别再被中介骗了 你是不是也经常看到网上有人在问“低压电工证到底值不值得考”?或者在找报名点时,担心被中间人骗钱?这些问题,我懂,我也经历过。作为一名在应急管理行业摸爬滚打多年的从业者,我深知低压电工证不仅是一个从… · 2026/11/14 0:00:31

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:12:21

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:11:51

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 22:31:30

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码