HarmonyOS之@Builder

🎯 什么是 @Builder

在 ArkTS 中,@Builder 是一个装饰器(Decorator) ,用于修饰一个函数,使其成为可以在 UI 构建中直接调用的结构函数(UI Builder Function)

它的设计目标是:

将一段可复用、无状态的 UI 结构以函数形式封装起来,以便灵活复用和组合。


🧠 本质理解:@Builder@Component

特性 @Builder @Component
本质 UI 结构的函数封装(无状态) 状态驱动的 UI 单元(组件)
生命周期支持 ❌ 不支持 ✅ 支持 aboutToAppear 等生命周期
响应式变量 ❌ 不支持定义状态,只能通过参数传入 ✅ 内部可使用 @State, @Prop
渲染方式 函数调用:this.myBuilder() 组件标签:<MyComponent />
渲染目标 插入父组件的 UI 树 独立的虚拟 DOM 节点

📦 为什么需要 @Builder

想象你要创建多个样式一样的按钮、卡片、列表项:

ts 复制代码
Button('提交').width(100).backgroundColor(Color.Blue)
Button('取消').width(100).backgroundColor(Color.Blue)
Button('重置').width(100).backgroundColor(Color.Blue)

有没有重复?有。

有没有状态?没有。

这时你可以这样做:

ts 复制代码
@Builder
function StyledButton(label: string) {
  Button(label).width(100).backgroundColor(Color.Blue)
}

这样做有 4 个好处:

  1. 避免重复代码
  2. 提高可维护性
  3. 提高可读性
  4. 支持参数自定义(可动态渲染)

🔧 @Builder 的工作机制

当你使用:

ts 复制代码
@Builder
function myBuilder(...) {
  // UI结构
}

ArkTS 会将该函数编译为 UI Fragment 构造函数,这个函数在调用时:

  1. 插入到调用处的 UI 构建树中
  2. 会按传入参数,构建对应的视图结构
  3. 不会绑定状态或响应式机制,因此无任何状态监听器或更新订阅器。

即:纯粹的 UI 构造器 + 参数驱动的"组件函数"


🧪 参数传递机制详解

✅ 按值传递(默认)

ts 复制代码
@Builder
function StaticText(text: string) {
  Text(text)  // 传的是固定值
}
  • text只读值 ,即使父组件变量变了,StaticText 中不会更新 UI。
  • 适合不变化的数据。

✅ 按引用传递($$

ts 复制代码
@Builder
function ReactiveText(text: $$string) {
  Text(text)  // 响应父组件的状态变化
}
  • 传入的是响应式引用(state 或 prop)
  • text 的值改变,UI 会自动刷新
  • 实现方式是通过内部的状态绑定机制,监听数据变化触发 UI 更新

🧩 @BuilderParam:构建函数作为参数传入

ts 复制代码
@Component
struct MyContainer {
  @BuilderParam slot: () => void

  build() {
    Column() {
      this.slot()  // 插入外部传来的 UI 构建函数
    }
  }
}

用法场景类似于:

  • React 中的 props.children
  • Vue 中的 <slot>
  • 插槽化 UI 设计,让 UI 可组合、可注入

🔁 动态布局组合:@Builder 的高级用法

你可以根据条件选择不同构建函数:

ts 复制代码
@Builder
function RedBox() {
  Text('Red').backgroundColor(Color.Red)
}

@Builder
function GreenBox() {
  Text('Green').backgroundColor(Color.Green)
}

@Component
struct SwitchBox {
  @State color: string = "red"

  build() {
    Column() {
      (this.color === 'red' ? this.RedBox : this.GreenBox)()
    }
  }
}

@Builder 实际就是可变的 UI 结构"模板",可以灵活组合。


⚠️ 注意事项 & 限制

项目 说明
❌ 不支持状态变量 无法定义 @State,只能通过参数传入
❌ 没有生命周期 无法使用 aboutToAppear 等生命周期钩子
✅ 可嵌套 @Builder 中可以调用其他 @Builder
❌ 无法访问组件状态 全局 Builder 函数中无法访问当前组件内状态
✅ 支持列表渲染 可结合 LazyForEach 动态渲染大量结构

✅ 推荐实践指南

目的 推荐做法
封装小段 UI(如按钮) 使用 @Builder
需要状态/生命周期/交互 使用 @Component
重复 UI 样式统一管理 提取为 @Builder 函数
动态组合布局 将多个 Builder 按条件组合调用
插槽式 UI(传 UI 做参数) 使用 @BuilderParam

📌 示例:构建统一的卡片组件样式

ts 复制代码
@Builder
function InfoCard(title: string, content: string) {
  Column() {
    Text(title).fontSize(20).fontWeight(FontWeight.Bold)
    Text(content).margin({ top: 10 })
  }
  .padding(20)
  .backgroundColor(Color.White)
  .borderRadius(8)
}

在多个组件中:

ts 复制代码
InfoCard("通知", "这是一条消息")
InfoCard("警告", "网络已断开")
相关推荐
ai安歌7 小时前
鸿蒙PC:Qt适配OpenHarmony实战【取色间】:RGB 滑动调整、HEX 展示和颜色预览
qt·华为·harmonyos
lqj_本人7 小时前
鸿蒙electron跨端框架PC想法卡片实战:把零散灵感做成能继续展开的卡片流
华为·electron·harmonyos
lqj_本人10 小时前
鸿蒙electron跨端框架PC浮签实战:做一面轻巧但能回找的桌面便签墙
华为·harmonyos
ai安歌10 小时前
鸿蒙PC:Qt适配OpenHarmony实战【人名录】:单机联系人卡片,不读系统通讯录也能演示详情联动
数据库·qt·harmonyos
lqj_本人11 小时前
鸿蒙electron跨端框架PC简序实战:把轻任务、优先级和截止时间塞进一张桌面清单
华为·harmonyos
想你依然心痛12 小时前
HarmonyOS 6 悬浮导航 + 沉浸光感:打造鸿蒙智能体驱动的沉浸式智能家居控制中枢
华为·ar·智能家居·harmonyos·智能体
lqj_本人12 小时前
鸿蒙PC:Qt适配OpenHarmony实战【花账】:从一笔支出开始,做一个本地记账小应用
数据库·qt·harmonyos
递归40412 小时前
ofdkit-harmony 0.2.0 发布:鸿蒙原生 OFD 阅读库,已上架 ohpm
开源·harmonyos·arkts·ofd·ohpm
nashane13 小时前
HarmonyOS 6学习:SoundPool音频防抖与Web长截图时序重构
学习·音视频·harmonyos·harmonyos 5
Exploring14 小时前
鸿蒙App开发,华为手机里装这一个就够了——「Hola万能计算器」到底有多万能?
harmonyos