跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
TypeScript大前端

HarmonyOS 6.0 应用开发:V2 装饰器@once 使用详解

鸿蒙 ArkTS 开发中,@Once 装饰器配合@Param 使用,实现子组件仅接收父组件初始值,后续数据变化不同步。适用于固定配置参数传递或子组件独立维护状态场景。结合@Once 后子组件可本地修改变量触发 UI 刷新,类似@Local 行为但保留初始值传递能力。数组类型数据通过@Once 传递时若未深拷贝,父子组件仍会形成双向同步效果。

kaikai发布于 2026/2/10更新于 2026/7/2036 浏览
HarmonyOS 6.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)。

@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 + 深拷贝完全隔离独立内存需要数据隔离的安全场景

目录

  1. V2 装饰器@once 的使用
  2. 概念
  3. 一、核心作用与规则
  4. 二、适用场景
  5. 案例
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 产品经理必备技术模型与三大知识体系
  • 数据结构:链式二叉树的递归实现与遍历分析
  • 基于腾讯云 CVM 部署 Clawdbot 并对接 Telegram 机器人
  • RAP-MCTS 算法详解:大模型思维链
  • SpringBoot+Vue 应急物资管理系统设计与实现
  • 滑动窗口算法实战:最大连续 1 与最小操作数
  • 老旧 ABAP 系统与云端新平台:RFC 驱动的现代 Web 应用实战指南
  • Android ClassLoader 核心机制与分类解析
  • 鸿蒙金融理财全栈项目:基础架构、数据安全与用户体验
  • Java 滑动窗口算法详解与 LeetCode 题解
  • Reasoning Models Generate Societies of Thought 论文解读
  • 纯 C# 自研轻量 UI 引擎:内核<200KB,支持.NET8 AOT 跨平台
  • 即梦 AI 基础操作指南:从绘图到视频生成
  • 基于 SpringBoot2+Vue3 的在线家具商城系统设计与实现
  • Gitea 本地部署指南:安装配置与常用 Git 命令实战
  • 30 行 Python 实现公开接口数据抓取与本地存储
  • 深度优先搜索 (DFS) 算法原理及 C++ 实现
  • 模拟算法基础:核心概念与典型案例分析
  • Linux 网络编程实战:基于 C++ 实现 JSON+HTTP Web 计算器服务器
  • Cursor+Codex 截图调试前端 Bug 实战(React/Chakra UI)

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online