HarmonyOS 应用开发《掌上英语》第68篇:组件复用实战——通用组件在各模块中的引用分析

📅 2026/8/1 8:26:12
HarmonyOS 应用开发《掌上英语》第68篇:组件复用实战——通用组件在各模块中的引用分析
组件复用实战——通用组件在各模块中的引用分析一、组件复用的价值在 11 模块架构中组件复用是减少代码重复、保持 UI 一致性的关键策略。通过将通用 UI 组件提取到 commonLib 模块所有 feature 和 component 模块都可以共享这些组件而无需在每个模块中重复实现。组件复用的主要收益开发效率提升一次实现多处使用减少重复编码UI 一致性所有页面使用相同的 TopBar、CommonHeader视觉风格统一维护成本降低组件修改只在 commonLib 中进行所有引用自动更新Bug 减少经过多模块验证的组件质量更有保障二、TopBar 组件的跨模块复用TopBar是最基础的复用组件位于commons/commonLib/src/main/ets/components/TopBar.etsComponentV2exportstruct TopBar{Paramtitle:string|Resource;ParamonClickBack:()void(){}build(){Row(){Row(){Image($r(app.media.ic_back)).width($r(app.float.vp_40)).height($r(app.float.vp_40)).borderRadius($r(app.float.vp_20)).onClick((){this.onClickBack()})}.width($r(app.float.vp_40)).height($r(app.float.vp_40)).borderRadius($r(app.float.vp_20)).backgroundColor($r(sys.color.background_secondary))Text(this.title).fontSize($r(sys.float.Title_S)).fontWeight(FontWeight.Medium).fontColor($r(sys.color.font_primary)).margin({left:$r(app.float.vp_8)})}}}TopBar 的设计特点使用Param接收输入title、onClickBack不管理内部状态默认提供空的onClickBack实现调用方可以选择不传通过$r引用公共资源不依赖特定模块的资源TopBar 在 homePage 的引用方式import{TopBar}fromcommonlib;// 在首页中使用TopBar({title:英语学习,onClickBack:()RouterModule.pop()})TopBar 在 topicPage 的引用TopBar({title:单词卡片,onClickBack:()RouterModule.pop()})同一个 TopBar 组件通过传入不同的 title服务于不同的页面。三、CommonHeader 组件CommonHeader即TopTabsBuilder是另一种结构的头部组件提供了更多的功能选项ComponentV2exportstruct TopTabsBuilder{Paramtitle:string;ParambgColor:ResourceStr$r(sys.color.background_secondary);ParamshowBackButton:booleanfalse;Paramtype:string一级建造师;Localindex:number0;}// 使用示例TopTabsBuilder({title:我的课程,showBackButton:true,type:英语学习})CommonHeader 比 TopBar 更复杂支持搜索按钮下拉选择自定义背景色可选的返回按钮四、Banner 组件的复用Banner 轮播图组件同样位于 commonLibComponentV2exportstruct Banner{ParambannerArray:ArrayResourceStr[$r(app.media.banner1),];LocalbreakpointModel:BreakpointModelAppStorageV2.connect(BreakpointModel,...)!;swiperDisplayCount:BreakpointTypenumbernewBreakpointTypenumber({sm:1,md:2,lg:3,xl:3,});build(){Column(){Swiper(){ForEach(this.bannerArray,(item:ResourceStr){Image(item).interpolation(ImageInterpolation.High).objectFit(ImageFit.Fill)...})}.autoPlay(true).displayCount(this.swiperDisplayCount.getValue(this.breakpointModel.currentBreakpoint))}}}Banner 的设计特点通过Param bannerArray接收图片数组不同页面可以传入不同的图片内置断点响应式自动根据屏幕宽度调整显示数量sm: 1, md: 2, lg: 3Param提供默认值空数组也能正常渲染五、组件接口的兼容性设计通用组件在跨模块复用时接口设计需要兼顾灵活性和简洁性Param 的默认值提供合理的默认值使调用方可以用最少的参数使用组件Paramtitle:string|Resource;// 默认为空ParamonClickBack:()void(){};// 默认无操作ParambgColor:ResourceStr$r(sys.color.background_secondary);// 默认背景单向数据流所有输入通过Param传入组件内部使用Local管理内部状态。这种单向数据流的设计保证了组件行为的可预测性。事件回调通过回调函数如onClickBack而不是直接调用RouterModule.pop()组件的导航行为由调用方决定通用性更强。六、跨模块引用的实现机制在 11 模块架构中跨模块引用的实现依赖于Index.etscommonLib 的Index.ets导出所有公共组件、模型、工具类// commons/commonLib/Index.etsexport{TopBar}from./src/main/ets/components/TopBar;export{Banner}from./src/main/ets/components/Banner;export{CommonHeader}from./src/main/ets/components/CommonHeader;export{RouterMap}from./src/main/ets/constants/RouterMap;export{AudioPlayer}from./src/main/ets/utils/AudioPlayer;// ...oh-package.json5在 feature 模块的依赖中声明 commonLib// features/homePage/oh-package.json5 { dependencies: { commonlib: file:../../commons/commonLib } }import 引用在具体页面中通过模块名引用import{TopBar,Banner,RouterMap,RouterModule}fromcommonlib;七、总结组件复用是 11 模块架构的核心设计原则之一。TopBar、CommonHeader、Banner 三个通用组件在 homePage、minePage、topicPage 等多个模块中实现了跨模块复用避免了重复编码。通过Param提供灵活的参数接口和合理的默认值、通过回调函数解耦导航逻辑、通过 Index.ets 统一导出commonLib 中的通用组件真正做到了一次编写多处运行。在实际开发中判断一个组件是否应该放入 commonLib 的标准是是否被两个或以上不同模块引用。满足这个条件的组件就应该考虑提取为通用组件。