news 2026/8/31 14:17:16

HarmonyOS 多设备短视频开发 : 07 — ArkUI 组件化设计:从公共组件库到业务模块复用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 多设备短视频开发 : 07 — ArkUI 组件化设计:从公共组件库到业务模块复用

07 — ArkUI 组件化设计:从公共组件库到业务模块复用

一、引言

在多设备短视频项目中,组件化设计体现在两个层面:一是 common 层的公共组件库,二是 features 层的业务模块封装。本文分析组件化设计思想、组件职责划分和跨模块复用机制。

二、公共组件库(common/multishortvideobase)

2.1 MSVTextIcon — 图文混合组件

最常用的基础组件,支持图标+文字+Builder 三种模式:

@ComponentV2 export struct MSVTextIcon { @BuilderParam content?: BuilderCallback; // 自定义内容 public text?: ResourceStr; // 文字 public iconOnly?: boolean; // 纯图标模式 public icon?: Resource; // 图标资源 public iconDark?: Resource; // 深色模式图标 public iconSize?: Length; // 图标尺寸 build() { if (this.content) { this.content() // Builder 模式 } else if (this.iconOnly) { Image(this.icon) // 纯图标模式 } else { Row() { Image(this.icon); Text(this.text) } // 图文混合 } } }

使用示例:

// 纯图标 MSVTextIcon({ src: $r('app.media.ic_heart_fill'), iconSize: 24 }) // 图文混合 MSVTextIcon({ src: $r('app.media.ic_heart_fill'), iconOnly: false, content: '1557', iconSize: 32 })

2.2 MSVTabs — 公共标签页组件

支持 HDS 浮动标签和原生 Tabs 两种模式,自动检测系统能力:

@ComponentV2 export struct MSVTabs { @Require @Param data: MSVDataModel[]; @Param useFloating: boolean = true; // 是否使用 HDS 浮动样式 @Param barPosition: BarPosition = BarPosition.Start; @Param barOverlap: boolean = true; // ... build() { if (canIUse('SystemCapability.UIDesign.HDSComponent.Core') && this.useFloating) { // HDS 浮动标签(智慧屏、电脑等) HdsTabs({ index: this.activeIndex }) { ... } .barFloatingStyle({ ... }) } else { // 原生 Tabs Tabs({ index: this.activeIndex }) { ... } .barBackgroundBlurStyle(BlurStyle.NONE) } } }

2.3 MSVEmptyComponent — 空状态组件

当数据为空时显示,统一空状态 UI。

2.4 MSVDataModel — 数据模型

export class MSVDataModel { public content?: BuilderCallback | null; // 标签页内容 public text?: ResourceStr; // 标签文字 public iconOnly?: boolean; // 纯图标标签 public icon?: Resource; // 正常图标 public iconDark?: Resource; // 深色图标 public iconSize?: Length; // 图标尺寸 }

三、业务模块复用(features 层)

3.1 视频播放模块

multishortvideoadaptivevideo对外暴露AdaptiveVideoAdaptiveVideoForDefault两个组件,后者增加了持握手势感知(鸿蒙左手/右手持握识别)。

3.2 评论区模块

multishortvideocomment对外暴露Comment组件,同时被半模态弹窗和侧边分栏复用:

// 半模态弹窗中 .bindSheet($$this.showComment, () => { Comment() }, { ... }) // 侧边分栏中 NavDestination() { Column() { Comment() } }

3.3 个人作品页模块

multishortvideoindividual对外暴露IndividualByRouter(带路由的入口)和内部组件IndividualWorks

四、跨模块通信机制

4.1 @Provider/@Consumer 装饰器

根组件通过@Provider提供共享状态,子组件通过@Consumer消费:

// 根组件(Index.ets) @Provider('pathStack') pathStack: NavPathStack = new NavPathStack(); @Provider('showSideComment') showSideComment: boolean = false; @Provider('showSideIndividual') showSideIndividual: boolean = false; @Provider('isDark') isDark: boolean = false; // 子组件(AdaptiveVideo.ets) @Consumer('showSideComment') showSideComment: boolean = false; @Consumer('showSideIndividual') showSideIndividual: boolean = false; @Consumer('pathStack') pathStack: NavPathStack = new NavPathStack();

4.2 @Local 本地状态

组件内部状态管理,用于 UI 响应的局部变量。

4.3 @Param 参数传递

AdaptiveAVPlayer({ currentIndex: this.curIndex, index: item.index, currentSource: item.item.currentSource, seekToTime: this.seekToTime, onStateNotify: (state) => { this.currentState = state; } })

五、组件化原则总结

  • 单一职责:每个组件只做一件事,MSVTextIcon 只负责图文展示,MSVTabs 只负责标签导航
  • 参数化配置:通过@Param和属性字段控制组件行为,避免硬编码
  • Builder 插槽:使用@BuilderParam提供自定义内容插槽,增强灵活性
  • 跨模块复用:features 层组件解耦,products 层按需组合
  • 响应式状态@Provider/@Consumer实现跨层级数据共享,避免 prop drilling

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 14:17:05

Cohere企业级AI实战:RAG、多语言与API接入指南

这几天,AI 圈值得关注的消息不只是某家大模型又刷了排行榜,而是 Cohere 首席 AI 官入选 TIME 100 AI 榜单。单看排行榜,大家比的是参数和推理分数;但 TIME 100 AI 这类榜单选择的是代表 AI 发展方向的产业人物。这个信号很直接&am…

作者头像 李华
网站建设 2026/8/31 14:16:02

Gurobi 与 Jupyter/Colab 环境配置及优化建模案例实战

在实际生产调度、物流配送、投资组合、排产计划这些场景里,Gurobi 是使用非常广泛的数学优化求解器。它能够处理线性规划、整数规划、二次规划以及混合整数规划等问题。把 Gurobi 和 Jupyter Notebook、Google Colab 结合起来使用,是学习优化建模很顺手的…

作者头像 李华
网站建设 2026/8/31 14:15:50

第二十八集雾版制作全流程:从版本管理到发布检查要点

《触不可及》做到第二十八集,能坚持到这里的连载项目,往往不缺灵感,缺的是让所有环节还能对齐的流程。尤其当这一集被标成“雾版”时,我的第一反应不是逐帧看画面美不美,而是先确认这个版本到底要验证什么。雾版不是“…

作者头像 李华
网站建设 2026/8/31 14:12:08

claude-video参数速查表:watch.py全部8个选项的完整参考

claude-video参数速查表:watch.py全部8个选项的完整参考 【免费下载链接】claude-video Give Claude the ability to watch any video. /watch downloads, extracts frames, transcribes, hands it all to Claude. 项目地址: https://gitcode.com/GitHub_Trending…

作者头像 李华
网站建设 2026/8/31 14:10:08

phpcolor v4.0:轻量级PHP贴吧社区程序重构与实战解析

简介:这是一套基于PHP开发的轻量级在线论坛系统——多彩贴吧(phpcolor)v4.0 Beta版源码,面向Web开发初学者与PHP后端实践者,旨在提供可快速部署、二次开发的社区交互平台参考实现。资源包共542个文件,涵盖2…

作者头像 李华
网站建设 2026/8/31 14:10:02

360春招PHP笔试客观题复盘:从考点陷阱到安全直觉

360春招那场笔试,我到现在还记得第一屏客观题弹出来时的压迫感:PHP基础、Web安全、数据库、网络协议,什么都在考,而且选择题的量比想象中大得多。很多人拿到“客观题合集”这五个字,以为刷一遍语法题就够了&#xff0c…

作者头像 李华