在这里插入图片描述

摘要

在鸿蒙(HarmonyOS)应用开发中,实时数据更新是一个绕不开的话题,尤其是在你封装了很多自定义组件、需要多个组件之间共享和同步数据的场景里。过去我们可能会依赖父子组件直接传参或全局状态管理,但这样写会让代码变得复杂、不易维护。鸿蒙提供了 @Observed@ObjectLink 装饰器,帮我们优雅地实现数据的实时更新和组件联动,开发体验非常顺滑。

引言

现在的鸿蒙应用场景越来越复杂,比如电商的商品详情和购物车同步、聊天应用的实时消息刷新、IoT 应用中的设备状态变更。这些都要求数据能在不同组件间实时更新,而且不能为了同步状态写一堆“搬运代码”。

在日常开发中,@Observed 负责让一个类的实例具备“可观察”的能力,一旦数据变化,引用它的组件就会自动刷新。@ObjectLink 则让子组件能够直接“订阅”父组件传下来的对象变化,而不需要手动再写回调去同步。

下面我们通过一个可运行的 Demo,把这套机制讲清楚。

用 @Observed + @ObjectLink 实现实时数据更新

基本原理

  • @Observed:让一个类的实例变成可观察对象,当它的属性发生变化时,会通知引用它的 UI 组件重新渲染。
  • @ObjectLink:用于子组件属性绑定,让子组件可以感知父组件传入的对象变化。

代码示例

// ViewModel.ts
@Observed
export class MyViewModel {title: string = ""constructor(title: string) {this.title = title}
}// OtherComponent.ets
@Component
export struct OtherComponent {@ObjectLink vm: MyViewModelbuild() {Row() {Text(this.vm.title).fontSize(20).fontWeight(FontWeight.Bold).margin(10)}.width("100%").height(60).backgroundColor("#eeeeee").justifyContent(FlexAlign.Center).alignItems(VerticalAlign.Center)}
}// MyComponent.ets
@Entry
@Component
export struct MyComponent {@State vm: MyViewModel = new MyViewModel("初始标题")build() {Column() {OtherComponent({ vm: this.vm }).onClick(() => {this.vm.title = "标题已更新 " + new Date().toLocaleTimeString()})Button("点击更新标题").margin(10).onClick(() => {this.vm.title = "按钮触发更新 " + new Date().toLocaleTimeString()})}.width("100%").height("100%")}
}

代码解析

MyViewModel

  • @Observed 修饰,让它的属性具备响应式更新能力。
  • 改变 title 会自动触发 UI 组件刷新。

OtherComponent

  • @ObjectLink 接收父组件传入的 vm,并实时订阅它的变化。
  • 不需要手动写事件监听,只要数据变化,UI 就会刷新。

MyComponent

  • @State 声明一个可响应的 MyViewModel 实例,并传给子组件。
  • 父组件点击区域或者按钮都会修改 vm.title,从而触发子组件刷新。

场景应用

场景 1:商品详情与购物车同步

描述:在电商应用中,用户在商品详情页修改购买数量,购物车组件的数量显示也需要立刻变化。

实现思路

  • 将商品数量信息放到一个 @Observed 的 ViewModel 中。
  • 详情页和购物车组件通过 @ObjectLink 共享这个 ViewModel。
@Observed
export class CartItem {count: number = 1
}@Component
export struct ProductDetail {@ObjectLink item: CartItembuild() {Column() {Button("增加数量").onClick(() => this.item.count++)}}
}@Component
export struct CartBar {@ObjectLink item: CartItembuild() {Text("数量: " + this.item.count)}
}

场景 2:聊天应用的实时消息

描述:在聊天页面发送消息,消息列表组件应当实时刷新。

实现思路

  • @Observed 包装一个 MessageList,内部是一个数组。
  • 消息输入框组件发送消息后,直接修改 MessageList,消息列表组件自动更新。
@Observed
class MessageList {messages: string[] = []
}@Component
struct ChatInput {@ObjectLink msgList: MessageListbuild() {Button("发送").onClick(() => {this.msgList.messages.push("新消息 " + Date.now())})}
}@Component
struct ChatList {@ObjectLink msgList: MessageListbuild() {Column() {ForEach(this.msgList.messages, (msg) => Text(msg))}}
}

场景 3:IoT 设备状态面板

描述:多个组件显示同一设备的温度、湿度、电池电量,任意组件更新数据时其他组件同步变化。

实现思路

  • @Observed 包装 DeviceStatus 对象。
  • 传递给各个子组件,通过 @ObjectLink 绑定。

QA 环节

Q1:@Observed 和 @State 有什么区别?

  • @Observed 用于类的实例,使它变成可观察对象,适合跨组件共享。
  • @State 用于组件内的变量,适合管理本地状态。

Q2:为什么要用 @ObjectLink,而不是直接传值?

  • 直接传值是浅拷贝,不会触发子组件刷新。
  • @ObjectLink 会建立对象引用,保证数据变化实时传递。

Q3:如果多个组件要共享数据,该怎么组织?

  • 建议抽一个 ViewModel,用 @Observed 修饰,在需要的地方通过 @ObjectLink 引用。

总结

在鸿蒙应用开发中,@Observed + @ObjectLink 是处理实时数据更新的“黄金搭档”。它们的组合能让我们轻松在多个组件间同步数据,而不用手动写一堆事件监听或状态同步逻辑。在实际项目中,不管是电商、聊天还是 IoT 应用,这套模式都能极大减少代码量,提高可维护性。

如果你现在的项目中有多个自定义组件需要共享数据,这套方法可以直接用起来,几乎不需要额外改动架构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918895.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918895.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918895.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生俱乐部-杂谈2

说实话,杂谈系列可能会比较少,因为毕竟大部分时间都是上的线上,迄今为止也是,和雷老师与WH的交流不是很多。这个系列仅仅是我在做其他笔记部分无聊的时候来写的,内容也没有规划过,随想随写。倒不是时间太多…

波浪模型SWAN学习(1)——模型编译与波浪折射模拟(Test of the refraction formulation)

SWAN模型编译与波浪折射模拟(Test of the refraction formulation)编译过程算例简介参数文件文件头(HEADING)计算区域和网格地形数据边界条件物理模块设置输出设置执行参数模拟结果由于工作原因,最近开始接触波浪模型&…

更换cmd背景图片

打开cmd 右击顶部,选择设置选择命令提示符,外观选择背景图像路径更改成自己的图片,然后右下角保存 设置成功

基于RobustVideoMatting(RVM)进行视频人像分割(torch、onnx版本)

发表时间:2021年8月25日 项目地址:https://peterl1n.github.io/RobustVideoMatting/ 论文阅读:https://hpg123.blog.csdn.net/article/details/134409222 RVM是字节团队开源的一个实时人像分割模型,基于LSTMConv实现,…

强制从不抱怨环境。

警世俗语:强者逆袭心法(句句穿心)环境是泥潭?那就让它开出金莲! —— 抱怨是弱者的裹脚布,行动是强者的登天梯。烂泥里也能种出摇钱树,关键看你敢不敢下手挖!老天爷发牌烂&#xff1…

MC0439符号统计

码蹄集OJ-符号统计 MC0439・符号统计 难度:黄金 时间限制:1 秒 占用内存:256 M 收藏 报错 在华容道放曹的紧张时刻,小码哥接到了一个看似微不足道却至关重要的任务:解读一条仅由小写英文字母组成的神秘字符串 s&#…

Android Jetpack 系列(五)Room 本地数据库实战详解

1. 简介 在需要轻量级本地持久化的场景中,DataStore 是一个理想的选择(详见《Android Jetpack 系列(四)DataStore 全面解析与实践》)。但当你面临如下需求时,本地数据库便显得尤为重要: 复杂的…

C语言实现类似C#的格式化输出

在C#中,格式化输出可以使用索引占位符以及复合格式的占位符,可以不用关心后面参数是什么类型,使用起来非常方便,如下简单的示例: Console.WriteLine("{2} {1} {0} {{{2}}}", "Hello, World!", 1,…

一人公司方法论

** 一人公司方法论 ** 那什么是一人公司? 字面的理解就是一个人运营的公司,但实际上它指代的是比较少的人运营的小公司,一般来说 1 ~ 3 个人运营的公司,也可以把它放到一人公司的范围以内。其他一些形式,比如说一个人再…

Ceph CSI 镜像删除流程与 Trash 机制失效问题分析文档

#作者:闫乾苓 文章目录一、问题背景二、实际行为三、源码分析四、分析与推论五、期望行为与建议优化六、结论一、问题背景 在生产环境中,为避免因误操作导致的永久数据丢失,Ceph RBD 提供了 Trash 功能,允许将镜像“软删除”至回…

.NET Framework 3.5 不原生支持PreApplicationStartMethod特性

.NET Framework 3.5 不原生支持PreApplicationStartMethod特性。这个特性是在 .NET Framework 4.0 中引入的,用于在应用程序启动早期执行初始化逻辑。 在.NET 3.5 中,如果你需要实现类似的 “应用启动时自动注册模块” 功能,需要通过手动配置…

智能巡检技术浅析

从机载智能硬件到深度学习算法,从实时边缘计算到数字孪生平台,无人机AI智能巡检通过多模态感知、自主决策和持续进化,实现从"被动检查"到"主动预防"的跨越式发展。机载智能硬件边缘计算与机载AI芯片当代先进巡检无人机已…

【图像算法 - 11】基于深度学习 YOLO 与 ByteTrack 的目标检测与多目标跟踪系统(系统设计 + 算法实现 + 代码详解 + 扩展调优)

前言 详细视频介绍 【图像算法 - 11】基于深度学习 YOLO 与 ByteTrack 的目标检测与多目标跟踪系统(系统设计 算法实现 代码详解 扩展调优)在计算机视觉应用中,目标检测与多目标跟踪的结合是实现智能视频分析的关键。本文基于 YOLO 检测模…

AI加持下的智能路由监控:Amazon VPC Direct Connect实战指南

> 一次流量突增引发的生产事故,如何催生出融合流日志、机器学习与自动化告警的智能监控体系 深夜2点,电商平台运维负责人李明的手机疯狂报警——北美用户下单量断崖式下跌。他紧急登录系统,发现跨境专线延迟飙升至2000ms。**经过3小时的排查**,罪魁祸首竟是新部署的CDN…

具身智能竞速时刻,百度百舸提供全栈加速方案

2025年,全球具身智能赛道迎来快速发展期,技术方向日益清晰。每一家企业都面临着同样的核心命题:如何将前沿的模型能力,转化为在真实世界各类场景中可规模化应用落地的机器人产品?这背后,是研发团队对模型迭…

JavaScript 压缩与混淆实战:Terser 命令行详解

使用 Terser 压缩 JavaScript 文件(基础 现代语法问题解决) 在前端开发中,随着业务复杂度增加,JavaScript 文件体积越来越大。 文件大带来的问题: 加载慢:文件越大,浏览器下载和解析时间越长…

【数据结构初阶】--排序(三):冒泡排序、快速排序

😘个人主页:Cx330❀ 👀个人简介:一个正在努力奋斗逆天改命的二本觉悟生 📖个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》 前言:在上篇博客的学习中,我们掌握了直接选择排序…

名词概念:什么是尾部误差?

“尾部误差”就是指误差分布在两端的那一小撮、但数值特别大的误差——也就是离中心(均值/中位数)很远的“极端样本”的误差。对应统计学里的“分布尾部”(tails)。通俗点:大多数样本误差都很小,但总会有少…

记对外国某服务器的内网渗透

本专栏是笔者的网络安全学习笔记,一面分享,同时作为笔记 文章目录前文链接前言上线CS上线rdp后渗透信息收集SMB Pth攻击权限维持魔幻上线提权关Windows Defenderend前文链接 WAMP/DVWA/sqli-labs 搭建burpsuite工具抓包及Intruder暴力破解的使用目录扫描…

速卖通平台关键字搜索商品列表列表接口实现指南:从接口分析到代码落地

在跨境电商开发中,速卖通平台的商品数据获取是许多开发者关注的焦点。本文将详细介绍如何实现速卖通关键字搜索商品列表接口,涵盖接口请求参数分析、签名机制、分页处理及完整代码实现,帮助开发者快速对接速卖通开放平台。一、接口基本信息速…