HarmonyOS 5.0应用开发——V2装饰器@once的使用
【高心星出品】
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+=1
})
}
.width('100%')
.padding(20)
}
}
@Entry
@ComponentV2
struct oncepage {
@Local count: number = 10;
build() {
Column({ space: 20 }) {
Button('page count: ' + this.count)
.width('60%')
.onClick(() => {
this.count += 1
})
// child count与 父组件count单向绑定
child3({ count: this.count })
}
.height('100%')
.width('100%')
}
}
父子组件同步的数据为数组的时候,使用@once和@param修改数组中元素不会造成单向同步而是会形成双向同步效果,例如下面案例,父子组件数据会同时改变。
@ComponentV2
struct child4 {
// 强制父组件传参 并且只会初始化一次
@Require @Once @Param arr:number[]
build() {
Column() {
Button('child count: ' + this.arr[0])
.width('60%')
.onClick(() => {
//@once装饰的变量 这里可以更新count值
this.arr[0]+=1
})
}
.width('100%')
.padding(20)
}
}
@Entry
@ComponentV2
struct oncepage1 {
@Local arr: number[] = [1,2,3];
build() {
Column({ space: 20 }) {
Button('page count: ' + this.arr[0])
.width('60%')
.onClick(() => {
this.arr[0] += 1
})
// child count与 父组件count单向绑定
child4({ arr: this.arr })
// 使用深度拷贝 就会造成隔离不会双向同步
// child4({arr:[...this.arr]})
}
.height('100%')
.width('100%')
}
}
| 装饰器组合 | 同步方式 | 内存关系 | 适用场景 | | ----------------- | -------------- | --------- | ---------------------------------- | | @Param
| 双向同步 | 共享引用 | 需要实时联动的组件(如协同编辑器) | | @Once @Param
| 单次初始化同步 | 共享引用* | 基于初始值的独立运作组件 | | @Param
+ 深拷贝 | 完全隔离 | 独立内存 | 需要数据隔离的安全场景 |

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
REST API 设计最佳实践指南 - 如何用 JavaScript、Node.js 和 Express.js 构建 REST API
过去几年里,我创建并使用过很多 API。在此过程中,我遇到过各种好的和坏的实践,也在开发和调用 API 时碰到过不少棘手的问题,但也有很多顺利的时刻。 网上有很多介绍最佳实践的文章,但在我看来,其中不少都缺乏实用性。只懂理论、没几个实例固然有一定价值,但我总是会想:在更真实的场景中,这些理论该如何落地? 简单的示例能帮助我们理解概念本身,避免过多复杂性干扰,但实际开发中事情往往没那么简单。我相信你肯定懂这种感受 😁 这就是我决定写这篇教程的原因。我把自己的所有经验(好的、坏的都有)整合到这篇通俗易懂的文章里,同时提供了可跟着操作的实战案例。最终,我们会一步步落实最佳实践,搭建出一个完整的 API。 开始前需要明确几点: 所谓"最佳实践",并非必须严格遵守的法律或规则,而是经过时间检验、被证明有效的约定或建议。其中一些如今已成为标准,但这并不意味着你必须原封不动地照搬。 它们的核心目的是为你提供方向,帮助你从用户体验(包括调用者和开发者)、安全性、性能三个维度优化 API。 但请记住:不同项目需要不同的解决方案。有些情况下,你可能无法或不应该遵循某条约定。因此,最终需要开发者自己或与团...
-
下一篇
MySQL单表为何别超2000万行?揭秘B+树与16KB页的生死博弈|得物技术
一、前 言 本文核心介绍,为何业界会有这样的说法?—— “MySQL单表存储数据量最好别超过千万级别” 当然这里是有前提条件的,也是我们最常使用到的: InnoDB存储引擎; 使用的是默认索引数据结构——B+树; 正常普通表数据(列数量控制在几个到一二十个,普通字段类型及长度)。 接下来咱们就探究一下原因,逐步揭开答案。 二、MySQL是如何存储数据的? 核心结构:B+树 + 16KB数据页 这里如下,建一张普通表user: CREATETABLE`user` ( `id`int(10) unsignedNOTNULLAUTO_INCREMENT COMMENT'主键', `name`varchar(100)NOTNULLDEFAULT''COMMENT'名字', `age`int(11)NOTNULLDEFAULT'0'COMMENT'年龄', PRIMARYKEY (`id`), KEY `idx_age` (`age`) ) ENGINE=InnoDB AUTO_INCREMENT=1DEFAULTCHARSET=utf8; 数据页(Page) 介绍 In...
相关文章
文章评论
共有0条评论来说两句吧...