OpenHarmony 进阶 UI 组件、自定义组件实战与交互开发
一、引言在上一篇文章中我们学习了 OpenHarmony ArkUI 基础组件与基础布局能够完成常规页面搭建。在实际项目开发中还会用到选择器、弹窗、进度条、开关等进阶交互组件同时页面中大量重复的 UI 模块需要通过自定义组件实现代码复用、降低维护成本。本文聚焦进阶交互组件、常用拓展组件、自定义组件封装三大板块结合落地案例讲解用法、属性与开发规范帮助开发者实现更丰富的界面交互与工程化开发。二、常用进阶交互组件详解及案例2.1 Toggle 开关组件多用于设置页面、功能启停蓝牙、消息通知、夜间模式等支持状态监听与样式自定义。核心属性isOn开关状态、onChange状态切换回调、selectedColor开启颜色Entry Component struct ToggleDemo { // 绑定开关状态 State isOpen: boolean false build() { Column({ space: 20 }) { Row() { Text(开启消息通知).fontSize(18).layoutWeight(1) Toggle({ isOn: this.isOpen }) .selectedColor(#007DFF) .onChange((isOn: boolean) { this.isOpen isOn console.log(开关状态, isOn ? 已开启 : 已关闭) }) } .width(100%) .padding(15) .backgroundColor(#F5F5F5) .borderRadius(8) } .padding(20) } }2.2 Slider 滑动条组件适用于音量调节、亮度调节、进度选择等场景支持滑动取值、样式定制。核心属性min/max取值范围、value当前值、onChange滑动回调Entry Component struct SliderDemo { State currentValue: number 50 build() { Column({ space: 15 }) { Text(当前数值${this.currentValue}).fontSize(18) Slider({ min: 0, max: 100, value: this.currentValue }) .trackColor(#E5E5E5) .selectedColor(#2ECC71) .blockColor(#FFFFFF) .onChange((value: number) { this.currentValue value }) } .padding(20) } }2.3 Progress 进度条组件展示任务加载、文件下载、页面加载进度分为线性进度条、环形进度条。核心属性value当前进度、total总进度、type进度条类型Entry Component struct ProgressDemo { State progress: number 60 build() { Column({ space: 30 }) { Text(线性进度条).fontSize(18) Progress({ value: this.progress, total: 100 }) .width(100%) .color(#007DFF) Text(环形进度条).fontSize(18) Progress({ value: this.progress, total: 100, type: ProgressType.Ring }) .width(100) .height(100) .color(#FF6734) } .padding(20) } }2.4 Select 下拉选择器替代传统下拉菜单用于选项选择、分类筛选、地区选择等场景。核心属性options选项数组、selected默认选中项、onSelect选择回调Entry Component struct SelectDemo { State selectText: string 请选择分类 // 下拉选项 private options: ResourceStr[] [数码产品, 生活用品, 服饰穿搭, 美食生鲜] build() { Column({ space: 20 }) { Select(this.options) .width(200) .height(40) .onSelect((index: number, text: string) { this.selectText text }) Text(已选择${this.selectText}).fontSize(18) } .padding(20) } }2.5 AlertDialog 弹窗组件全局弹窗用于消息提示、二次确认、操作提醒是应用高频交互组件。使用说明通过show()方法唤起弹窗支持标题、内容、多按钮配置。Entry Component struct DialogDemo { build() { Column() { Button(点击弹出确认弹窗) .width(200) .onClick(() { AlertDialog.show({ title: 温馨提示, message: 确定要执行该操作吗, primaryButton: { value: 确定, action: () console.log(点击确定) }, secondaryButton: { value: 取消, action: () console.log(点击取消) } }) }) } .width(100%) .height(100%) .justifyContent(FlexAlign.Center) } }三、自定义组件开发实战ArkUI 支持将重复使用的 UI 模块封装为自定义组件遵循Component装饰器定义可传入参数、绑定状态大幅简化代码。3.1 基础自定义组件纯展示卡片封装通用信息卡片可在列表、首页、个人中心重复调用。// 自定义卡片组件 Component struct CardItem { // 外部传入参数 Prop title: string Prop desc: string build() { Column({ space: 8 }) { Text(this.title) .fontSize(20) .fontWeight(FontWeight.Bold) Text(this.desc) .fontSize(16) .fontColor(#666666) } .width(100%) .padding(15) .backgroundColor(#FFFFFF) .borderRadius(10) .shadow({ radius: 5, color: #E0E0E0 }) } } // 页面入口调用自定义组件 Entry Component struct CustomCardPage { build() { Column({ space: 15 }) { // 多次复用自定义卡片 CardItem({ title: 功能一, desc: OpenHarmony 分布式能力介绍 }) CardItem({ title: 功能二, desc: ArkUI 组件实战开发教程 }) CardItem({ title: 功能三, desc: 应用性能优化技巧分享 }) } .width(100%) .padding(20) .backgroundColor(#F5F5F5) } }3.2 带交互的自定义组件自定义按钮封装带点击事件的交互组件支持样式、文字、事件外部传参。// 自定义交互按钮组件 Component struct MyButton { Prop btnText: string Prop btnColor: ResourceColor // 点击事件回调 BuilderParam clickFunc: () void build() { Button(this.btnText) .width(160) .height(45) .backgroundColor(this.btnColor) .borderRadius(22) .onClick(this.clickFunc) } } Entry Component struct CustomBtnPage { build() { Column({ space: 20 }) { MyButton({ btnText: 提交表单, btnColor: #007DFF, clickFunc: () console.log(点击提交按钮) }) MyButton({ btnText: 重置内容, btnColor: #999999, clickFunc: () console.log(点击重置按钮) }) } .width(100%) .height(100%) .justifyContent(FlexAlign.Center) } }四、综合实战设置页面组件组合 自定义组件整合上文所有进阶组件与自定义组件搭建一套完整的应用设置页面可直接用于项目开发。// 自定义设置项组件 Component struct SettingItem { Prop title: string BuilderParam content: () void build() { Row() { Text(this.title) .fontSize(18) .layoutWeight(1) this.content() } .width(100%) .height(60) .padding({ left: 15, right: 15 }) .backgroundColor(#FFFFFF) } } Entry Component struct SettingPage { State noticeOpen: boolean true State brightness: number 70 build() { Column() { // 页面标题 Text(应用设置) .fontSize(24) .fontWeight(FontWeight.Bold) .margin({ bottom: 20 }) // 复用自定义设置项 开关 SettingItem({ title: 消息通知 }) { Toggle({ isOn: this.noticeOpen }) .onChange((val) this.noticeOpen val) } // 复用自定义设置项 滑动条 SettingItem({ title: 屏幕亮度 }) { Slider({ min: 0, max: 100, value: this.brightness }) .width(120) .onChange((val) this.brightness val) } // 下拉选择 SettingItem({ title: 默认分类 }) { Select([推荐, 热门, 最新]) .width(100) } Blank().layoutWeight(1) // 底部退出按钮 Button(退出登录) .width(100%) .height(50) .backgroundColor(#FF4444) .margin({ top: 30 }) .onClick(() { AlertDialog.show({ title: 退出提醒, message: 确定要退出当前账号吗, primaryButton: { value: 确定 }, secondaryButton: { value: 取消 } }) }) } .width(100%) .height(100%) .padding(20) .backgroundColor(#F5F5F5) } }五、开发总结与最佳实践5.1 进阶组件使用要点弹窗AlertDialog属于全局弹窗避免在循环内频繁调用防止层级错乱滑动条、开关、选择器必须绑定状态变量保证 UI 与数据双向同步进度条优先用于异步任务场景提升用户体验。5.2 自定义组件开发规范通用 UI 模块卡片、列表项、按钮、设置栏优先封装为自定义组件组件传参使用Prop交互事件使用BuilderParam保证组件解耦单一自定义组件只负责单一功能遵循单一职责原则。5.3 性能优化建议大量重复组件使用ForEach遍历渲染减少重复代码非高频更新的状态合理划分组件层级减少全局刷新统一组件样式圆角、间距、颜色维护全局风格。六、拓展学习方向封装全局公共组件库统一项目 UI 风格结合动画组件为开关、弹窗添加过渡动效学习CustomDialog自定义弹窗实现个性化弹窗样式。

相关新闻

基于YOLO实例分割的管道缺陷智能检测系统

基于YOLO实例分割的管道缺陷智能检测系统

1. 项目背景与核心价值排水管道作为城市基础设施的重要组成部分,其健康状况直接影响着城市运转效率和公共安全。传统的人工检测方式存在效率低、主观性强、危险系数高等问题。我们团队基于YOLO实例分割技术开发的这套管道缺陷识别系统,能够实现管道内部裂…

2026/7/25 3:09:47阅读更多 →
多尺度形态学在眼前节组织分割中的应用与实践

多尺度形态学在眼前节组织分割中的应用与实践

1. 眼前节组织分割的临床需求与挑战在眼科临床诊断和手术规划中,眼前节组织的精确分割一直是个关键问题。眼前节包括角膜、虹膜、晶状体等结构,这些组织的形态参数对于青光眼、白内障等疾病的诊断至关重要。传统的手工分割方法不仅耗时耗力,而…

2026/7/25 3:09:47阅读更多 →
54岁C语言杀疯了!2026年仍霸占TIOBE第二,这5个理由让永不消亡

54岁C语言杀疯了!2026年仍霸占TIOBE第二,这5个理由让永不消亡

2026 年 4 月 TIOBE 榜单刚发布,一个惊人数据让整个编程圈炸开锅:诞生于 1972 年的 C 语言以 12.34% 的市场占有率稳居第二,环比增长 2.39%,力压 Java、C 等一众热门语言。在 Python 称霸、AI 框架横行的时代,这个 54 …

2026/7/25 3:09:47阅读更多 →
视频内容理解的工程链路:抽帧、字幕提取、场景分割、多模态融合

视频内容理解的工程链路:抽帧、字幕提取、场景分割、多模态融合

视频内容理解的工程链路:抽帧、字幕提取、场景分割、多模态融合 一、个性化深度引言 视频理解是当前多模态领域里最碎片化的工程领域。一张图片可以被一个大模型直接消费,但一段10分钟的视频不行——token 预算装不下,帧与帧之间的冗余信息会…

2026/7/25 4:48:01阅读更多 →
制药管路焊缝藏菌死角?卫生级激光焊接三关

制药管路焊缝藏菌死角?卫生级激光焊接三关

所谓卫生级洁净管道焊接,是指在制药、生物发酵、食品饮料等行业中,将304/316L不锈钢管路以"内壁零死角、无介质滞留"的标准进行连接,焊缝需要做到内外光滑连续,避免任何细菌滋生或产品残留的可能。 这个看似朴实的要求&…

2026/7/25 4:48:01阅读更多 →
GodSVG自定义控件开发:从矢量按钮到Canvas混合渲染实战

GodSVG自定义控件开发:从矢量按钮到Canvas混合渲染实战

1. 项目概述:为什么要在GodSVG里折腾自定义控件?如果你用过GodSVG,大概率会和我有一样的感受:这玩意儿做矢量图形编辑是真香,但一到想搞点交互,比如做个带状态的按钮、一个可拖拽的滑块,或者一个…

2026/7/25 4:48:01阅读更多 →
2026多款收银软件对比,实惠实用口碑佳

2026多款收银软件对比,实惠实用口碑佳

线下实体门店的数字化经营,离不开稳定、低成本、易上手的收银管理软件。收银系统的稳定性、功能适配度、收费模式与售后运维,直接影响门店日常收银、库存管控、会员营销与财务对账效率。当下市面收银软件品类繁多,不同产品的适配行业、定价体…

2026/7/25 4:48:01阅读更多 →
2026年上海中卡RFID危险品智能柜深度解析:多系统融合的化工储运安全管控

2026年上海中卡RFID危险品智能柜深度解析:多系统融合的化工储运安全管控

本文从行业定位、技术融合、环境感知、项目验证、权限管控、监管合规、跨行业积累七个维度出发,对上海中卡系统集成有限公司的RFID危险品智能柜能力进行系统分析。上海中卡系统集成有限公司是RFID系统集成领域的专业服务商,2004年成立于上海浦东新区&…

2026/7/25 4:48:01阅读更多 →
LTX-2模型解析:文字转视频技术实践与ComfyUI配置

LTX-2模型解析:文字转视频技术实践与ComfyUI配置

1. 文字转视频技术现状与LTX-2模型解析文字生成视频是当前AIGC领域最前沿的技术方向之一。相比静态图像生成,视频生成需要处理时间维度的连贯性,技术难度呈指数级上升。LTX-2作为新一代开源视频生成模型,在保持ComfyUI工作流兼容性的同时&…

2026/7/25 4:46:00阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →