V2 装饰器@once 的使用
概念
在鸿蒙 ArkTS 开发中,@Once 装饰器用于实现子组件仅接受父组件传递的初始值,后续父组件数据变化不再同步至子组件。以下是其核心要点:
一、核心作用与规则
- 初始化同步一次
@Once与@Param结合使用,子组件仅在初始化时接收父组件传递的值,后续父组件数据更新时不会触发同步。 - 强制依赖关系
@Once必须与@Param搭配使用,单独使用或与其他装饰器(如@Local)结合会编译失败。- 装饰顺序不影响功能,
@Param @Once或@Once @Param均有效。
- 本地修改支持
结合@Once后,子组件可以修改@Param变量值并触发 UI 刷新,此时行为类似@Local,但仍保留初始值传递能力。
二、适用场景
- 固定初始值:父组件传递配置参数(如主题色、默认尺寸),子组件仅需初始化时使用。
- 独立维护状态:子组件基于父组件初始值构建自身状态后,不再依赖外部更新。
案例
父组件(oncepage):
点击按钮时,@Local 修饰的 count 自增,并通过 child3({ count: this.count }) 传递最新值给子组件。但子组件仅在首次渲染时接收初始值(如 10),后续父组件的 count 变化不会更新子组件。
子组件(child3):
点击按钮时,子组件内部 count 自增并更新 UI,但父组件的 count 始终保持独立状态(例如父组件 count 为 15 时,子组件可能显示为 12)。
@ComponentV2 struct child3 {
// 强制父组件传参 并且只会初始化一次
@Require
@Once
@Param count: number
build() {
Column() {
Button('child count: ' + this.count)
.width('60%')
.onClick(() => {
// @once 装饰的变量 这里可以更新 count 值
this.count +=
})
}
.()
.()
}
}
struct oncepage {
: =
() {
({ : }) {
( + .)
.()
.( {
. +=
})
({ : . })
}
.()
.()
}
}


