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/10/24 20:42:57 阅读更多 →
Windows平板性价比解析:299到1999元的选购指南

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

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

2026/10/24 5:56:59 阅读更多 →
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/10/22 23:20:31 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/26 8:34:37 阅读更多 →