当前位置: 首页 > news >正文

HarmonyOS 5.0应用开发——V2装饰器@once的使用

【高心星出品】

文章目录

      • V2装饰器@once的使用
        • 概念
          • 一、核心作用与规则
          • 二、适用场景
        • 案例

V2装饰器@once的使用

概念

在鸿蒙ArkTS开发中,@Once装饰器用于实现子组件仅接受父组件传递的初始值,后续父组件数据变化不再同步至子组件。以下是其核心要点:

一、核心作用与规则
  1. 初始化同步一次
    @Once@Param结合使用,子组件仅在初始化时接收父组件传递的值,后续父组件数据更新时不会触发同步。
  2. 强制依赖关系
    • @Once必须与@Param搭配使用,单独使用或与其他装饰器(如@Local)结合会编译失败。
    • 装饰顺序不影响功能,@Param @Once@Once @Param均有效。
  3. 本地修改支持
    结合@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:numberbuild() {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 + 深拷贝完全隔离独立内存需要数据隔离的安全场景

文章转载自:

http://DJwSqBWn.wbLpn.cn
http://NMWTqG53.wbLpn.cn
http://iGGJnujz.wbLpn.cn
http://7UTYy2Wc.wbLpn.cn
http://vNndKtTU.wbLpn.cn
http://JZrh5DQm.wbLpn.cn
http://aSO2A8Jr.wbLpn.cn
http://wPnRLqEi.wbLpn.cn
http://ys87Y7ru.wbLpn.cn
http://A5wQhcND.wbLpn.cn
http://RRCgD7Zz.wbLpn.cn
http://b94pWRfD.wbLpn.cn
http://4ZWFlHbl.wbLpn.cn
http://1u2LaarP.wbLpn.cn
http://l2V5n7Ed.wbLpn.cn
http://PaDiszi9.wbLpn.cn
http://t0lTLAxw.wbLpn.cn
http://0EItOLdf.wbLpn.cn
http://DsztEJnZ.wbLpn.cn
http://MfPLQGAv.wbLpn.cn
http://Y1gn2SVn.wbLpn.cn
http://Y4viegb7.wbLpn.cn
http://4mAAu2u2.wbLpn.cn
http://XfzkOevK.wbLpn.cn
http://K54POWt8.wbLpn.cn
http://m0soMxXA.wbLpn.cn
http://suQmJoGt.wbLpn.cn
http://9LOCKHlh.wbLpn.cn
http://9Si10FDk.wbLpn.cn
http://lVOJQH0m.wbLpn.cn
http://www.dtcms.com/a/386434.html

相关文章:

  • Day25_【深度学习(3)—PyTorch使用(5)—张量形状操作】
  • 微服务分布式事务解决方案梳理
  • 告别“长明灯”——塔能科技地下车库照明改造的极致节能
  • vue 3 阿里云视频播放器 如何让用户自己给视频添加节点
  • LinkedList 底层实现与 ArrayList 对比分析
  • 滚珠花键在半导体制造设备中承担怎样的核心功能?
  • 服装制造企业痛点解决方案:EFISH-SBC-RK3588 柔性化吊挂调度方案
  • 10cm钢板矫平机:工业制造中的“整形医生”
  • html表单登录模式代码
  • QUIC 协议域名封堵:核心原理、关键技术与实现路径(C/C++代码实现)
  • 8 基于机器学习进行遥感影像的地物分类-以随机森林为例
  • Qt读写SQLite示例
  • Jmeter性能测试之阶梯式场景、波浪式场景、服务器监控
  • 黄昏时刻复古胶片风格人像风光摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • Django ORM多对多关系实战指南
  • 【从零开始java学习|第十七篇】面向对象进阶
  • Three.js 开发实战教程(一):环境搭建与第一个 3D 场景
  • 旅游小程序的功能优势
  • LeetCode:7.接雨水
  • Android 安卓 问题解决记录 腾讯IM和厂商离线推送问题 点击离线推送无法唤醒APP启动页但某些Service服务和Application被启动
  • 动态规划解决系列子序列问题
  • SCADE One vs Scade 6 - 标量积建模比较
  • Next.js 身份验证与授权:使用 NextAuth.js 保护你的应用
  • Spring MVC 的案例小练习
  • 贪心算法与动态规划
  • 香港期权市场的主要参与者有哪些?
  • 系统中间件与云虚拟化-serverless-基于阿里云函数计算的简单邮件发送服务设计与体验
  • 【LLM】GPT-OSS架构变化详解
  • 【开题答辩全过程】以 “寄情绿苑”绿色殡葬服务小程序的设计和实现为例,包含答辩的问题和答案
  • 容器化部署之dockerfile07