HarmonyOS 5.0应用开发——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)。

less 复制代码
@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修改数组中元素不会造成单向同步而是会形成双向同步效果,例如下面案例,父子组件数据会同时改变。

less 复制代码
@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 + 深拷贝 完全隔离 独立内存 需要数据隔离的安全场景
相关推荐
云端漫步19876 小时前
HarmonyOS 互动卡片(Live Form)入门指南:双态架构与场景动效全景解析
华为·架构·harmonyos
OH_TPC14 小时前
HarmonyOS APP开发---“绿管家“智能植物监测App,需要用到这个库
华为·harmonyos·鸿蒙
云端漫步198718 小时前
HarmonyOS 互动卡片实战:快递卡片与睡眠卡片完整开发流程
华为·harmonyos
智塑未来19 小时前
鸿蒙6.1隐私安心加倍:加密分享、星盾防诈、应用锁三重保护,守护到位
华为·harmonyos
byte轻骑兵20 小时前
2026手机远程办公:向日葵、TeamViewer、ToDesk鸿蒙适配+传文件+AI审计功能对比
智能手机·harmonyos·todesk·teamviewer·手机远程办公
贾伟康20 小时前
【知律|06】HarmonyOS ArkTS 法律分类实战:让民法、劳动、消费等入口可维护
harmonyos·arkts·arkui·分类设计·多设备
梦想不只是梦与想1 天前
鸿蒙 测试工具:DevEco Testing(一)
测试工具·harmonyos·testing
大锅盖12 天前
Web 工单要调用相机,第一步不是打开取景框,而是建立能力门禁
前端·数码相机·harmonyos
贾伟康2 天前
【华夏二十四节气|07】HarmonyOS 6.0.2(22) ArkTS 节气搜索实战:多字段匹配与四态闭环
移动开发·harmonyos·arkts·arkui·本地搜索
大龄秃头程序员2 天前
Flutter 项目鸿蒙适配实战:从环境搭建到多环境打包全指南
harmonyos