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自定义弹窗实现个性化弹窗样式。

相关新闻

B端拓客中法人号码核验的精准解决方案

B端拓客中法人号码核验的精准解决方案

1. B端拓客中的法人号码核验痛点企业服务领域(B端)的销售团队都面临一个经典难题:如何从海量企业信息中筛选出有效的法人联系方式?这个问题看似简单,实际操作中却存在诸多陷阱。我服务过三家不同规模的ToB企业&#xf…

2026/10/18 3:35:54 阅读更多 →
Codex接入第三方大模型:协议适配与三种实战方案详解

Codex接入第三方大模型:协议适配与三种实战方案详解

如果你最近在尝试将 Codex 这个备受关注的 AI 编程助手接入 DeepSeek、GLM 或 Kimi 这类第三方大模型,并且发现事情远没有“填个 API Key 就能用”那么简单,那么这篇文章就是为你准备的。 一个普遍的误解是:既然 Codex 支持自定义模型端点,那么接入任何第三方 API 都应该像…

2026/10/18 3:37:28 阅读更多 →
C++ REST API 与 Nginx 集成部署实战:从开发到上线的完整指南

C++ REST API 与 Nginx 集成部署实战:从开发到上线的完整指南

这次我们来看一个典型的 C++ 后端项目实战,它集成了 REST API 设计、幂等性保障,并最终通过 Nginx 部署为静态资源服务器。对于 C++ 开发者而言,从编码到部署上线,每一步都充满挑战。本文将带你走通一个完整流程:从搭建 C++ REST 服务,到实现核心业务逻辑,再到通过 Ngin…

2026/10/18 3:37:37 阅读更多 →

最新新闻

Qt 解析 Gerber RS-274X:从 D 码到 PCB 预览器实战

Qt 解析 Gerber RS-274X:从 D 码到 PCB 预览器实战

简介:这份资源面向从事PCB制造与CAM开发的工程师及Qt C学习者,提供一套完整的Gerber文件解析与转换工具源码,解决将PCB设计数据转化为生产指令的实际问题。包内共381个文件,以147个svg图形资源、90个h头文件与86个cpp源文件为核心…

2026/10/18 23:42:37 阅读更多 →
三层交换机VLAN间路由配置实战:SVI与ip routing全解析

三层交换机VLAN间路由配置实战:SVI与ip routing全解析

做了无数次VLAN划分,发现不同VLAN之间就是不通,这几乎是每个网络初学者都会撞上的墙。以往靠单臂路由解决,但带宽和性能瓶颈明显。这次实验彻底换了个思路,用三层交换机直接实现VLAN间路由,配置下来发现事情比想象中简…

2026/10/18 23:42:37 阅读更多 →
三层交换机实现VLAN间路由配置详解

三层交换机实现VLAN间路由配置详解

做网络实验久了你会发现,真正难的不是某个命令怎么写,而是搞清楚"为什么需要这个命令"。VLAN间路由配置就是典型例子。很多初学者会困惑:VLAN不是已经把广播域隔离了吗,为什么还要路由?VLAN之间明明物理上连…

2026/10/18 23:42:37 阅读更多 →
EZCAD2二次开发核心:MarkEzd.dll与C#激光打标自动化

EZCAD2二次开发核心:MarkEzd.dll与C#激光打标自动化

简介:面向激光打标行业开发者与自动化集成工程师的二次开发资料包,围绕EZCAD激光打标软件展开,包含EZCAD2完整源代码、MarkEzd.dll动态链接库及配套测试工程,可用来深入理解从图形编辑、条码二维码生成、序列号自动递增到振镜控制…

2026/10/18 23:42:37 阅读更多 →
RS-485双向RDM通信实战:从物理层时序到协议帧构造

RS-485双向RDM通信实战:从物理层时序到协议帧构造

简介:本资源是一份面向嵌入式开发工程师与工业通信初学者的RS-485双向RDM通信实践代码包,聚焦解决多设备网络中主从识别、命令交互与可靠数据传输等核心问题,适用于智能照明、舞台设备控制、工业传感器组网等典型RDM应用场景。压缩包为ZIP格式…

2026/10/18 23:42:37 阅读更多 →
Qwen3.5 GGUF构建指南:从源码到可验证量化推理链

Qwen3.5 GGUF构建指南:从源码到可验证量化推理链

简介:本资源是一份面向AI开发者与本地大模型实践者的Qwen3.5系列GGUF模型下载与部署实操指南,聚焦解决模型获取路径混乱、下载速度慢、LM Studio加载报错等高频痛点。压缩包仅6KB,含3个核心文件:index.html为结构化操作文档&#…

2026/10/18 23:41:37 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →