在这里插入图片描述

一、前言

先同步一个重磅进展:目前「心晴驿站」已正式上架华为应用市场,全网可直接搜索下载体验。本系列所有技术文章,均为上线成品项目的真实落地代码与架构思路,所有规范、组件、优化方案均经过真机测试、上架审核验证,具备100%可复用、可落地、可过审的实战价值。

在前四篇专栏中,我们完成了项目立项规划、环境搭建、Stage模型分层架构、全局路由统一封装,彻底搭建起项目稳定的底层技术底座。当前项目架构层级清晰、路由流转规范,已经具备大规模业务UI开发的基础条件。

本篇作为系列第五篇,聚焦ArkUI声明式UI核心组件化能力。针对鸿蒙新手常见的页面代码臃肿、UI重复编写、样式不统一、耦合严重、适配混乱等问题,结合心晴驿站治愈系轻量化UI风格,搭建一套上架级、高复用、低耦合、标准化的全局公共组件体系。彻底统一全站UI视觉、交互、适配规范,大幅精简代码量,提升项目可维护性与迭代效率。

二、为什么一定要做组件化封装?

2.1 原生零散开发的核心痛点

在鸿蒙原生开发中,如果不做组件化拆分,直接在页面内堆砌ArkUI代码,随着业务迭代会暴露出大量问题,也是绝大多数参赛项目、个人开源项目的通病:

  • 代码极度冗余:卡片、按钮、占位空态、导航栏等高频UI重复编写,大量重复代码堆积;

  • UI风格混乱:不同页面圆角、间距、阴影、配色不统一,整体产品质感差,不符合上架审美规范;

  • 耦合度极高:UI渲染、业务逻辑、样式代码混杂在页面中,难以修改、难以复用、难以迭代;

  • 维护成本剧增:全局样式微调需要修改每一个页面,一处改动、全页适配,效率极低;

  • 性能无法优化:无组件复用机制,页面频繁刷新、重复渲染,造成不必要的性能损耗。

2.2 心晴驿站组件化设计目标

结合应用轻、柔、暖的治愈设计理念与华为应用市场上架UI规范,本次组件化封装明确四大核心目标:

  • 视觉统一:全局圆角、间距、阴影、字体、配色标准化,保证全站治愈风格一致;

  • 高复用低耦合:UI与业务逻辑解耦,组件独立可插拔,支持任意页面快速调用;

  • 适配兼容:组件内置弹性适配,兼容不同鸿蒙机型、分辨率,杜绝页面错乱;

  • 性能最优:配合ArkUI复用装饰器,减少重复渲染,降低内存占用,贴合轻量化定位。

三、ArkUI组件化核心原理与规范

3.1 自定义组件核心特性

ArkUI声明式UI最大的优势就是组件化、声明式、响应式。区别于命令式UI,ArkUI自定义组件具备独立的作用域、状态管理、样式体系,是大型鸿蒙项目规范化开发的核心基础。

核心装饰器规范(项目统一使用):

  • @Component:定义自定义UI组件,具备独立渲染能力;

  • @Reusable:开启组件复用缓存,页面跳转、刷新时复用组件实例,大幅提升渲染性能;

  • @Prop:接收父组件传参,单向数据流,保证组件纯净无副作用;

  • @State:组件内部私有状态,仅组件内部响应更新。

3.2 项目组件分层架构

基于之前搭建的四层整体架构,我们在组件层(components)做精细化拆分,分为两大类型组件,严格遵循单一职责、高内聚低耦合原则:

  1. 全局公共基础组件:无业务属性,纯UI展示,全站通用,如治愈卡片、空白占位、通用按钮、分割条;

  2. 业务定制组件:贴合心晴驿站业务场景,如测评条目、游戏卡片、语录展示组件,仅业务页面复用。

四、核心公共组件实战落地(上线成品代码)

本节分享项目中使用率最高、通用性最强的四大公共组件,代码均为上架成品版本,可直接复制复用,适配治愈系UI风格。

4.1 全局治愈卡片组件(核心通用)

项目所有内容模块统一使用该卡片组件,内置统一圆角、阴影、内边距,完美契合「柔、暖」设计风格,支持自定义标题、内容、点击事件。


/**
 * 全局治愈风格卡片公共组件
 * 统一项目圆角、阴影、边距规范
 */
@Reusable
@Component
export struct WarmCard {
  // 卡片标题
  @Prop title: string = ''
  // 卡片自定义高度
  @Prop cardHeight: number | string = 'auto'
  // 点击回调事件
  @Prop cardClick?: () => void

  build() {
    Column() {
      // 标题区域
      if (this.title) {
        Text(this.title)
          .fontSize(16)
          .fontWeight(FontWeight.Medium)
          .margin({ bottom: 12 })
      }
      // 自定义插槽内容
      Column() {
        @slot
      }
    }
    .width('100%')
    .height(this.cardHeight)
    .padding(16)
    .backgroundColor(Color.White)
    .borderRadius(16)
    .shadow({ radius: 12, color: '#0E00000F' })
    .onClick(() => {
      if (this.cardClick) this.cardClick()
    })
  }
}
    

4.2 空白占位组件(空态统一适配)

适配测评记录为空、游戏记录为空、网络空态等场景,统一全局空页面展示样式,避免空页面杂乱简陋,提升产品精致度。

/**
 * 全局空白占位组件
 * 统一项目空数据、空列表展示样式
 */
@Reusable
@Component
export struct EmptyPlaceholder {
  @Prop emptyText: string = '暂无数据'

  build() {
    Column()
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center) {
      Text(this.emptyText)
        .fontSize(14)
        .fontColor('#999999')
    }
  }
}
    

4.3 全局通用柔和按钮组件

替换系统原生僵硬按钮,统一治愈系圆角、渐变、点击反馈,支持主按钮、次按钮两种样式,适配答题、开始游戏、查看记录等所有场景。


/**
 * 全局柔和按钮组件
 * 适配治愈系UI风格,支持两种主题样式
 */
@Reusable
@Component
export struct WarmButton {
  @Prop text: string = ''
  @Prop primary: boolean = true
  @Prop onClick: () => void

  build() {
    Button(this.text)
      .width('100%')
      .height(44)
      .borderRadius(12)
      .backgroundColor(this.primary ? '#7FB8F7' : '#F5F7FA')
      .fontColor(this.primary ? Color.White : '#666666')
      .fontSize(15)
      .onClick(() => this.onClick())
  }
}
    

4.4 底部导航栏组件(全局唯一)

封装项目四大Tab全局导航,统一切换样式、选中态、图标文字,结合上一篇路由架构,实现页面无栈跳转,彻底解耦页面与导航逻辑。


/**
 * 全局底部导航组件
 * 配合路由架构实现页面统一跳转
 */
@Reusable
@Component
export struct TabBar {
  @Prop currentIndex: number
  @Prop onTabChange: (index: number) => void

  // 导航列表配置
  private tabList: Array<{title: string}> = [
    { title: '首页' },
    { title: '测评' },
    { title: '治愈' },
    { title: '我的' }
  ]

  build() {
    Row()
    .width('100%')
    .height(60)
    .backgroundColor(Color.White)
    .justifyContent(FlexAlign.SpaceAround)
    .border({ top: { width: 1, color: '#EEEEEE' } }) {
      ForEach(this.tabList, (item: {title:string}, index: number) => {
        Column() {
          Text(item.title)
            .fontSize(12)
            .fontColor(this.currentIndex === index ? '#7FB8F7' : '#999999')
        }
        .onClick(() => this.onTabChange(index))
      })
    }
  }
}
    

五、组件通信与复用规范

5.1 单向数据流规范

项目严格遵循单向数据流原则:父页面通过@Prop向子组件传递数据与回调,子组件不修改外部父级状态,仅通过回调函数通知父页面更新状态,彻底规避状态混乱、数据不同步的问题,保证项目状态可控、可维护。

5.2 @Reusable复用性能优化

所有公共组件统一添加**@Reusable装饰器,开启ArkUI组件缓存复用机制。在页面频繁跳转、刷新、列表渲染场景下,无需重复创建组件实例,大幅降低CPU与内存开销,契合心晴驿站轻量化、低功耗**的产品定位,也是应用上架性能优化的关键细节。

5.3 插槽灵活扩展

核心卡片组件统一内置@slot插槽,支持父页面自定义嵌套内容,在保证组件样式统一的同时,保留极高的业务灵活性,兼顾「规范性」与「扩展性」。

六、组件化落地带来的项目提升(上架核心优势)

6.1 UI体验标准化

全站UI圆角、阴影、间距、配色完全统一,告别页面风格割裂问题,产品整体质感大幅提升,完全满足华为应用市场UI精细化审核标准,是项目顺利上架的重要基础。

6.2 代码量大幅精简

高频UI模块全部封装复用,页面代码量减少40%以上,页面仅保留业务逻辑与数据渲染,结构清晰、简洁易读。

6.3 迭代维护效率翻倍

全局样式统一收口于公共组件,如需微调主题色、圆角、边距,仅需修改组件内部代码,无需逐页修改,适配长期迭代优化。

6.4 运行性能更优异

组件复用+按需渲染机制,减少页面重复创建与销毁,页面切换更流畅,内存占用更低,通过应用市场性能检测审核。

七、组件化开发踩坑复盘(上架避坑)

7.1 组件样式硬编码混乱问题

问题:初期页面直接写死颜色、圆角数值,不同页面参数不统一,UI杂乱。

解决:全部抽离至公共组件,统一样式参数,全局UI标准化。

7.2 子组件直接修改父状态

问题:子组件直接修改父页面变量,导致状态溯源困难、页面刷新异常。

解决:严格单向数据流,子组件仅触发回调,父组件统一更新状态。

7.3 未开启组件复用导致卡顿

问题:频繁切换页面、重复渲染组件,造成轻微卡顿、内存波动。

解决:所有公共组件统一添加@Reusable,开启系统缓存复用。

八、本篇总结与下篇预告

本篇我们基于已上架成品项目,完整讲解了心晴驿站ArkUI组件化架构设计思路、全局公共组件封装规范、组件通信原则与性能优化方案。通过标准化组件化改造,项目实现了UI统一、代码解耦、性能优化、维护提效,完全达到华为应用市场上架精细化UI与性能标准。

组件化体系的搭建,为后续首页、测评、治愈游戏等完整业务页面的快速开发提供了强力支撑,让所有业务页面实现「一键复用、统一风格、高效迭代」。在这里插入图片描述

下篇预告(第六篇):首页治愈页面从零实战开发,结合路由架构+公共组件库,完整实现动态时段问候、每日语录、树洞入口、功能快捷入口的成品首页,落地产品温柔治愈的核心视觉体验。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐