当前位置:首页>鸿蒙APP>鸿蒙开发进阶|组件复用终极指南:@Component 还是 @Builder?一篇讲透!

鸿蒙开发进阶|组件复用终极指南:@Component 还是 @Builder?一篇讲透!

  • 2026-08-27 10:35:58
鸿蒙开发进阶|组件复用终极指南:@Component 还是 @Builder?一篇讲透!

🧩 鸿蒙开发进阶|组件复用终极指南:@Component 还是 @Builder?一篇讲透!

HarmonyOS 架构设计 · 告别重复代码,拥抱高效开发

大家好,我是 程序员小V 👨‍💻
你是否遇到过这些场景?

  • • 同一个用户卡片,在“联系人”“聊天”“个人中心”三个页面都要用?
  • • 列表项 UI 写了三遍,改样式要改三次?
  • • 团队协作时,前端和 UI 工程师互相等对方改代码?

这些问题的根源,都是缺乏组件化思维!
今天我们就深入 ArkTS 的两大组件复用方案,教你如何写出高内聚、低耦合、易维护的鸿蒙应用!


🎯 为什么必须做组件复用?

随着项目规模扩大,单一组件文件会迅速膨胀,导致:

  • • ❌ 代码冗长,难以阅读
  • • ❌ 相同 UI 多处复制,修改成本高
  • • ❌ 违背 DRY(Don’t Repeat Yourself)原则
  • • ❌ 团队协作效率低下

✅ 组件化的目标:

  • • 一次编写,多处使用
  • • UI 与逻辑解耦
  • • 支持单元测试
  • • 提升团队协作效率

在 ArkTS 中,官方提供了两种主流复用方式:

  1. 1. 独立组件(@Component + @Prop) → 跨页面复用
  2. 2. 自定义构建器(@Builder) → 页面内复用

下面,我们逐一对比,帮你选对方案!


📦 方案一:独立组件(推荐跨页面使用)

这是最常用、最推荐的方式,尤其适合通用 UI 单元(如用户卡片、商品项、消息气泡等)。

✅ 实现步骤

  1. 1. 创建 components/ 文件夹;
  2. 2. 新建 UserCard.ets 文件;
  3. 3. 使用 @Component + @Prop 封装;
  4. 4. 在其他页面导入使用。
// src/main/ets/components/UserCard.ets
import
 { User } from "../common/UserDemo"

@Component

export
 struct UserCard {
  @Prop
 item: User; // 接收父组件数据

  build
() {
    Column
() {
      Text
('姓名:' + this.item.name)
        .fontSize(16)
        .fontWeight(FontWeight.Bold)
      Text
('邮箱:' + this.item.email)
        .fontSize(14)
        .fontColor('
#666')
    }
    .width('100%')
    .padding(10)
    .backgroundColor('#f9f9f9')
    .borderRadius(8)
  }
}

💡 关键点:

  • • @Prop:单向数据流,子组件不能修改传入值;
  • • export struct:必须导出才能被导入;
  • • 路径建议:src/main/ets/components/,统一管理。
独立组件目录

🔧 使用方式

在父组件中导入并调用:

import { UserCard } from '../components/UserCard'

// ...

ForEach
(this.users, (item: User) => {
  UserCard
({ item: item }) // ⚠️ 必须用 { } 包裹参数!
})

❌ 常见错误:
写成 UserCard(item) 会报错!ArkTS 要求具名参数必须显式声明。

调用语法

✅ 优势

  • • 跨页面复用:一个组件,处处可用
  • • 类型安全:TypeScript 自动校验 item 类型
  • • 样式统一:改一处,全局生效
  • • 支持状态管理:可使用 @State、@Link 等

🛠️ 方案二:自定义构建器 @Builder(轻量级复用)

@Builder 是一种函数式 UI 复用机制,适用于同一页面内的重复片段。

✅ 实现方式

在当前组件内部定义:

// 在 Index.ets 内部
@Builder

renderUserItem
(item: User) {
  Column
() {
    Text
('姓名:' + item.name)
    Text
('邮箱:' + item.email)
  }
  .padding(10)
  .margin(5)
}

🔧 使用方式

直接调用,像普通函数:

ForEach(this.users, (item: User) => {
  this
.renderUserItem(item) // 无需导入,直接调用
})
Builder 使用

✅ 优势 vs ❌ 局限

优势
局限
✅ 语法简洁,无额外文件
❌ 仅限当前组件内部
✅ 零性能开销(无组件实例化)
❌ 无法跨页面复用
✅ 适合简单、高频 UI 片段
❌ 不支持 @State 等状态装饰器

📌 使用建议:

  • • 列表项、表单项等页面内重复内容 → 用 @Builder
  • • 用户卡片、弹窗、按钮等通用 UI → 用独立组件

🆚 终极对比:一张表看懂怎么选

特性
独立组件(@Component)
自定义构建器(@Builder)
作用域
全局(跨页面)
仅当前组件
数据传递@Prop
(单向绑定)
函数参数(值传递)
状态管理
✅ 支持 @State/@Link
❌ 不支持
性能开销
有组件实例化成本
⚡ 几乎为零
适用场景
通用 UI 单元(卡片、弹窗)
页面内重复片段
工程结构
需新建文件,目录清晰
代码内联,快速实现
对比总结

🧭 最佳实践建议

1. 命名规范

  • • 独立组件:PascalCase → UserCard.ets
  • • Builder:camelCase → renderUserItem

2. 目录组织

src/main/ets/
├── components/       # 通用组件
│   ├── UserCard.ets
│   └── ProductItem.ets
├── pages/            # 页面
└── common/           # 模型、工具类

3. 避免过度拆分

若某 UI 只用一次,不要强行抽取!保持代码简洁更重要。

4. 强类型约束

无论哪种方式,务必添加 TypeScript 类型注解:

renderUserItem(item: User) // ✅ 明确类型

💎 总结

  • • 独立组件(@Component) = 重型武器 → 跨页面、复杂交互、长期维护
  • • 自定义构建器(@Builder) = 轻量工具 → 页面内、简单 UI、快速实现

🌟 高手思维:
不是“会不会拆组件”,而是“在正确场景用最合适的方式”。

掌握这两种复用模式,你就能构建出结构清晰、易于扩展、团队友好的鸿蒙应用架构!


作者:程序员小V(VON)
专注 HarmonyOS / Flutter / OpenHarmony 开发
用代码构建生态,用分享照亮他人

👉 关注我的 CSDN 主页,获取更多鸿蒙实战教程:
🔗 https://blog.csdn.net/2302_80329073

最新文章

随机文章