ArkUI 声明式开发:组件与构建器
ArkUI 声明式开发组件与构建器ArkUI 是鸿蒙的声明式 UI 框架。它用描述界面长什么样替代一步步操作视图配合状态驱动自动刷新。本文系统讲清 ArkUI 的组件体系、内置组件、自定义组件、Builder/Styles/Extend复用手段以及组件生命周期帮你写出结构清晰、可复用的界面。一、声明式 UI 的核心思想传统命令式 UI如早期 AndroidfindViewByIdsetText是拿到控件、手动改它声明式 UI 是根据状态描述界面应有的样子。当状态变化框架自动计算差异并重绘。ArkUI 的三要素组件ComponentUI 的最小单元如Text、Button、Image。属性Attribute通过链式调用配置组件如.fontSize(20)。状态State被State等装饰的变量变化触发 UI 刷新。Entry Component struct Index { State liked: boolean false; build() { Column() { Text(this.liked ? 已点赞 : 未点赞) Button(this.liked ? 取消 : 点赞) .onClick(() { this.liked !this.liked; }) } } }你只声明了文本随 liked 变化点击后框架自动更新——这就是声明式的威力。二、内置基础组件ArkUI 提供丰富内置组件常用的有组件用途Text文本Button按钮Image图片TextInput输入框Toggle开关Progress进度条Slider滑块List/ListItem列表Grid/GridItem网格Scroll滚动容器文本与按钮Text(鸿蒙) .fontSize(20) .fontColor(#333) .lineHeight(28) .textAlign(TextAlign.Center) Button(提交, { type: ButtonType.Capsule }) .width(120) .height(40) .backgroundColor(#0A59F7) .onClick(() { /* 处理点击 */ })输入框带双向绑定State keyword: string ; TextInput({ placeholder: 搜索 }) .onChange((v: string) { this.keyword v; }) Text(你输入了 this.keyword)三、图片组件 ImageImage支持本地资源、网络、PixelMap、SVG// 本地资源$r 引用 resources/media Image($r(app.media.banner)) .width(200) .height(120) .borderRadius(8) .objectFit(ImageFit.Cover) // 网络图片需 ohos.permission.INTERNET Image(https://example.com/a.png) .width(100) .height(100) .onComplete(() { console.info(加载完成); }) .onError(() { console.error(加载失败); }).objectFit控制填充方式Cover裁剪填满、Contain完整显示、Fill拉伸。四、列表与懒加载ListForEach是展示集合数据的主力虚拟滚动只渲染可视区域性能极佳interface Item { id: number; name: string; } Entry Component struct ListPage { State data: Item[] [ { id: 1, name: 商品A }, { id: 2, name: 商品B } ]; build() { List({ space: 10 }) { ForEach(this.data, (item: Item) { ListItem() { Row() { Text(item.name).fontSize(16) } .padding(12) .backgroundColor(#FFF) .borderRadius(8) } .onClick(() { console.info(点击 item.name); }) }, (item: Item) item.id.toString()) // 第二参唯一 key性能关键 } .width(100%) .height(100%) .padding(12) } }ForEach的第三个参数是键值生成函数返回稳定唯一 key 才能正确复用节点、避免错乱——这是 ArkUI 性能优化的关键点。五、自定义组件把一段 UI 封装成Component结构体接受Prop入参Component struct ProductCard { Prop product: Item { id: 0, name: }; State pressed: boolean false; build() { Column() { Text(this.product.name).fontSize(16).fontWeight(FontWeight.Medium) Button(加入购物车) .margin({ top: 8 }) .onClick(() { this.pressed true; }) } .width(100%) .padding(16) .backgroundColor(this.pressed ? #E8F0FE : #FFF) .borderRadius(12) } } // 使用 Column() { ForEach(this.data, (it: Item) { ProductCard({ product: it }) }) }自定义组件让页面像搭积木一样组合复杂界面也能保持可读。六、BuilderUI 片段复用Builder用于复用无独立状态的小片段分组件内与全局两种// 全局 Builder Builder function EmptyView(tip: string) { Column() { Image($r(app.media.empty)) .width(80).height(80) Text(tip).fontColor(#999).margin({ top: 8 }) } } // 组件内 Builder用 this. 调用 Component struct Page { Builder loadingView() { LoadingProgress().width(40).height(40) } build() { Column() { EmptyView(暂无数据) this.loadingView() } } }Builder还支持尾随闭包写法做插槽式组件Component struct Card { BuilderParam content: () void; // 占位插槽 build() { Column() { Text(卡片标题).fontWeight(FontWeight.Bold) this.content(); // 渲染外部传入的内容 } .padding(16) .backgroundColor(#FFF) .borderRadius(12) } } // 使用尾随闭包 Card() { Text(这是卡片内容).fontSize(14) }BuilderParam让组件变成容器类似 Web 的 children slot极大提升复用度。七、Styles 与 Extend样式复用// 组件内 Styles Component struct S { Styles card() { .backgroundColor(#FFF) .borderRadius(12) .padding(16) .shadow({ radius: 8, color: #00000010, offsetY: 2 }) } build() { Column() { }.card() } } // 全局 Extend必须指定组件类型 Extend(Text) function subtitle() { .fontSize(14) .fontColor(#666) } Text(副标题).subtitle()八、组件生命周期自定义组件有一组生命周期回调钩子触发时机aboutToAppear组件即将显示build 前适合初始化数据aboutToDisappear组件即将销毁适合释放资源onPageShow/onPageHide页面显示/隐藏仅 EntryonBackPress用户点击返回Component struct Clock { State now: string ; aboutToAppear(): void { this.now new Date().toLocaleString(); } aboutToDisappear(): void { console.info(时钟组件销毁清理定时器); } build() { Text(this.now) } }九、事件与回调ArkUI 事件通过.onClick、.onChange等链式方法绑定TextInput() .onChange((v) { this.keyword v; }) .onSubmit(() { this.search(); }) Button(长按).gesture( LongPressGesture({ repeat: false }) .onAction(() { console.info(长按触发); }) )手势系统点击、长按、滑动、捏合后面有专门篇章这里先建立事件也是链式属性的认知。十、条件与循环渲染// if/else 条件渲染 if (this.loading) { LoadingProgress() } else if (this.data.length 0) { EmptyView(暂无数据) } else { List() { /* ... */ } } // ForEach 循环渲染 ForEach(this.tabs, (t: string, idx: number) { Text(t).fontColor(idx this.current ? #0A59F7 : #333) }, (t: string) t)注意if/else分支切换会销毁/重建子树频繁切换的场景考虑用透明度等属性替代以保性能。十一、性能优化要点ForEach 必须给稳定 key否则节点错乱、重渲染。大列表用 List 虚拟滚动不要直接 Column 堆几百项。提取自定义组件减少 build 函数体积便于框架复用。避免在 build 里做重计算计算放aboutToAppear或State更新时。用 BuilderParam 做插槽减少包裹层。十二、总结ArkUI 的声明式范式让界面 状态的函数。本文覆盖了内置组件、Image、List 懒加载、自定义组件、Builder/BuilderParam插槽、Styles/Extend样式复用、生命周期与事件绑定。掌握这些你已能用 ArkUI 搭出结构清晰、可复用的界面。但 UI 真正的灵魂是状态如何流动——下一篇我们深入状态管理。

相关新闻

Claude Code架构解析与开发辅助系统实践

Claude Code架构解析与开发辅助系统实践

1. Claude Code 架构解析与核心概念Claude Code 是一个扩展标准功能的开发辅助系统,通过模块化设计实现代码生成、任务执行和上下文管理。其核心架构围绕三个关键概念构建:Hooks(钩子)、Skills(技能)和 Sub…

2026/7/21 20:41:03 阅读更多 →
Windows平板性价比解析:299到1999元的选购指南

Windows平板性价比解析:299到1999元的选购指南

1. 从299到1999:Windows平板的性价比之战作为一名混迹数码圈十年的老玩家,我经手测试的Windows平板不下50台。最近帮学弟装机时发现,市面上居然出现了299元的Windows平板,而同样打着"高性价比"旗号的产品,价…

2026/7/20 18:28:53 阅读更多 →
MarkItDown:终极文档转换神器,20+格式一键变Markdown的完整指南

MarkItDown:终极文档转换神器,20+格式一键变Markdown的完整指南

MarkItDown:终极文档转换神器,20格式一键变Markdown的完整指南 【免费下载链接】markitdown Python tool for converting files and office documents to Markdown. 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown 还在为各种文档…

2026/7/20 18:27:52 阅读更多 →

最新新闻

C++俄罗斯方块项目实战:从架构设计到性能优化的完整指南

C++俄罗斯方块项目实战:从架构设计到性能优化的完整指南

1. 项目概述:为什么用C重写俄罗斯方块依然值得深究? 俄罗斯方块,这个诞生于上世纪80年代的经典游戏,几乎成了每一位程序员学习图形编程或游戏逻辑的“Hello World”。你可能觉得,用C实现一个俄罗斯方块,听起…

2026/7/22 2:42:48 阅读更多 →
架构揭秘:REFramework如何实现RE引擎游戏的跨平台模组支持

架构揭秘:REFramework如何实现RE引擎游戏的跨平台模组支持

架构揭秘:REFramework如何实现RE引擎游戏的跨平台模组支持 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework REFramework作为RE Engin…

2026/7/22 2:42:48 阅读更多 →
Linux 下 cat 和 more 的用法

Linux 下 cat 和 more 的用法

Linux 下 cat 和 more 的用法 cat: 一次性显示整个文件 文件过长时会一屏刷到底 # 显示文件内容 cat file.txt# 带行号显示 cat -n file.txt# 连接多个文件 cat file1.txt file2.txt# 将内容重定向写入文件 cat file1.txt file2.txt > combined.txtmore :分页显示&#xff0…

2026/7/22 2:42:48 阅读更多 →
pi0.7阅读

pi0.7阅读

本论文提出了一种能够利用多样化数据源的方法1.引言线索笔记栏研究动机想让 VLA 既可以像 LLM 组合式去调用原子技能执行长程任务LLM:如果让它以鲁迅的语气(元素 A),写一篇关于量子力学(元素 B)的科普文章&…

2026/7/22 2:42:48 阅读更多 →
计算机科学家Edward Xie的分布式系统优化方法论

计算机科学家Edward Xie的分布式系统优化方法论

由于提供的输入内容过于简略(仅包含人名"Edward Xie"),缺乏必要的项目描述、关键词和摘要信息,无法生成符合要求的专业博文。根据内容安全原则和创作规范,我需要您补充以下必要信息才能继续:项目…

2026/7/22 2:42:47 阅读更多 →
使用leader-line.js实现网页元素间美观连线

使用leader-line.js实现网页元素间美观连线

1. 项目概述leader-line.js 是一个轻量级的 JavaScript 库,专门用于在网页元素之间绘制美观的指引线。作为一名前端开发者,我最近在项目中遇到了需要在不同 DOM 元素之间建立视觉连接的需求,经过多方调研最终选择了这个库。它不仅配置灵活&am…

2026/7/22 2:41:47 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻