在鸿蒙(HarmonyOS)的 ArkUI 框架中,装饰器(Decorator)是状态管理和组件通信的核心机制。以下是 @State
、@Prop
、@Provide
和 @BuilderParam
四个关键装饰器的详细解析:
1. @State
:组件私有状态
- 作用:
声明组件内部可变的私有状态数据。当状态改变时,触发当前组件的 UI 重新渲染。 - 特点:
- 响应式:值变化自动更新 UI
- 私有性:只能在当前组件内部访问
- 初始化:必须本地初始化值
- 使用场景:
组件内部的状态管理(如按钮点击状态、输入框内容) - 示例:
@Component
struct MyComponent {
@State count: number = 0 // 私有状态
build() {
Button(`点击: ${this.count}`)
.onClick(() => this.count++) // 修改状态触发UI更新
}
}
2. @Prop
:父子组件单向同步
- 作用:
实现父组件到子组件的单向数据同步(父组件更新会同步到子组件)。 - 特点:
- 单向绑定:父 → 子(子组件修改不会影响父组件)
- 自动同步:父组件值变化时自动更新子组件
- 需初始化:必须从父组件接收初始值
- 使用场景:
父组件向子组件传递只读数据 - 示例:
// 父组件
@Component
struct Parent {
@State parentCount: number = 10
build() {
Child({ count: this.parentCount }) // 传递数据
}
}
// 子组件
@Component
struct Child {
@Prop count: number // 接收父组件数据
build() {
Text(`父传来的值: ${this.count}`)
//❌ this.count++ 不允许直接修改
}
}
3. @Provide
和 @Consume
:跨层级双向同步
(通常成对使用)
@Provide
作用:
在祖先组件声明提供数据(无需逐层传递)@Consume
作用:
在后代组件直接消费提供的数据- 特点:
- 跨层级:跳过中间组件
- 双向同步:任何一端修改都会同步到另一端
- 类型匹配:需确保提供和消费的数据类型一致
- 使用场景:
深层嵌套组件间的数据共享(如主题色、用户信息) - 示例:
// 祖先组件提供数据
@Component
struct Ancestor {
@Provide themeColor: string = 'blue'
}
// 后代组件直接消费(跳过中间层级)
@Component
struct Descendant {
@Consume themeColor: string // 自动获取祖先数据
build() {
Button("操作")
.backgroundColor(this.themeColor)
.onClick(() => {
this.themeColor = 'red' // 修改会影响所有消费者
})
}
}
4. @BuilderParam
:动态UI构建
- 作用:
接收一个@Builder
函数作为参数,实现 UI 片段的动态注入(类似插槽/Slot) - 特点:
- UI参数化:将UI结构作为参数传递
- 灵活组合:实现高度可配置的容器组件
- 类型约束:需匹配
() => void
函数类型 - 使用场景:
通用容器组件(如卡片、弹窗)的内容自定义 - 示例:
// 定义可配置的容器组件
@Component
struct CustomContainer {
@BuilderParam contentBuilder: () => void // 声明UI插槽
build() {
Column() {
Text("容器标题")
this.contentBuilder() // 动态渲染传入的UI
}
}
}
// 使用容器
@Component
struct Parent {
@Builder customContent() { // 定义注入的UI
Text("这是自定义内容")
Button("操作按钮")
}
build() {
CustomContainer({
contentBuilder: this.customContent // 传入UI构造器
})
}
}
对比总结表:
装饰器 | 数据流向 | 作用范围 | 典型场景 |
---|---|---|---|
@State |
组件内部 | 当前组件 | 私有状态管理 |
@Prop |
父 → 子 | 父子组件 | 父组件向子组件传只读数据 |
@Provide |
祖先 → 后代 | 跨层级组件 | 深层嵌套组件数据共享 |
@Consume |
后代 → 祖先 | 跨层级组件 | 消费祖先提供的数据 |
@BuilderParam |
UI注入 | 任意组件 | 动态内容插槽 |
关键区别:
- 状态所有权:
@State
:状态归当前组件所有@Prop
:状态归父组件所有(只读副本)@Provide
:状态归祖先组件所有
- 更新传播:
@Prop
:只能从源头(父组件)发起更新@Provide/@Consume
:任何一端修改都会双向同步
- 设计思想:
@State/@Prop
:基于组件层级的数据流@Provide/@Consume
:依赖注入模式@BuilderParam
:组合式UI设计
合理使用这些装饰器可以实现清晰的数据流和灵活的组件复用,是鸿蒙应用开发的核心技能。