81.HarmonyOS NEXT 状态管理与响应式编程:@Observed深度解析
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

HarmonyOS NEXT 状态管理与响应式编程:@Observed深度解析
文章目录
- HarmonyOS NEXT 状态管理与响应式编程:@Observed深度解析
- 1. 响应式编程基础
- 1.1 什么是响应式编程?
- 1.2 响应式更新流程
- 2. @Observed装饰器详解
- 2.1 基本用法
- 2.2 工作原理
- 2.3 使用场景
- 3. 状态管理最佳实践
- 3.1 模型设计原则
- 3.2 组件集成
- 4. 实战案例分析
- 4.1 购物车模型实现
- 4.2 主题管理实现
- 5. 性能优化指南
- 5.1 优化策略
- 5.2 性能优化示例
- 5.3 最佳实践建议
1. 响应式编程基础
1.1 什么是响应式编程?
响应式编程是一种基于数据流和变化传播的编程范式。在HarmonyOS中,响应式编程主要通过以下机制实现:
| 机制 | 说明 | 使用场景 |
|---|---|---|
| @State | 组件内状态管理 | 组件级数据更新 |
| @Link | 父子组件数据同步 | 组件间数据传递 |
| @Observed | 类级别状态管理 | 复杂数据模型 |
| @ObjectLink | 对象引用传递 | 引用类型数据同步 |
1.2 响应式更新流程
数据变化 -> 触发观察者 -> 更新依赖 -> 渲染UI
2. @Observed装饰器详解
2.1 基本用法
@Observed
class DataModel {public value: number = 0;constructor() {this.value = 0;}updateValue(newValue: number) {this.value = newValue; // 触发响应式更新}
}
2.2 工作原理
- 属性代理:@Observed通过代理机制监听属性变化
- 依赖收集:自动追踪数据依赖关系
- 更新触发:属性变化时自动触发UI更新
2.3 使用场景
| 场景 | 示例 | 说明 |
|---|---|---|
| 数据模型 | 用户信息模型 | 管理复杂的数据结构 |
| 状态管理 | 应用全局状态 | 跨组件状态共享 |
| UI控制 | 主题管理 | 统一管理UI状态 |
3. 状态管理最佳实践
3.1 模型设计原则
@Observed
class UserModel {// 1. 明确的数据结构private _name: string;private _age: number;// 2. 封装的访问方法get name(): string {return this._name;}// 3. 验证的更新方法setAge(age: number): boolean {if (age < 0 || age > 150) return false;this._age = age;return true;}// 4. 状态重置方法reset(): void {this._name = '';this._age = 0;}
}
3.2 组件集成
@Component
struct UserProfile {@State private userModel: UserModel = new UserModel();build() {Column() {Text(this.userModel.name)Button('更新年龄').onClick(() => {this.userModel.setAge(25);})}}
}
4. 实战案例分析
4.1 购物车模型实现
@Observed
class CartModel {private items: Array<ItemModel> = [];private total: number = 0;addItem(item: ItemModel): void {this.items.push(item);this.calculateTotal();}removeItem(id: string): void {this.items = this.items.filter(item => item.id !== id);this.calculateTotal();}private calculateTotal(): void {this.total = this.items.reduce((sum, item) => sum + item.price, 0);}
}@Observed
class ItemModel {id: string;name: string;price: number;quantity: number;constructor(id: string, name: string, price: number) {this.id = id;this.name = name;this.price = price;this.quantity = 1;}updateQuantity(newQuantity: number): void {if (newQuantity > 0) {this.quantity = newQuantity;}}
}
4.2 主题管理实现
@Observed
class ThemeModel {private _isDark: boolean = false;private _primaryColor: string = '#000000';private _fontSize: number = 14;get isDark(): boolean {return this._isDark;}toggleTheme(): void {this._isDark = !this._isDark;this.updateThemeColors();}private updateThemeColors(): void {if (this._isDark) {this._primaryColor = '#FFFFFF';} else {this._primaryColor = '#000000';}}
}
5. 性能优化指南
5.1 优化策略
| 策略 | 实现方式 | 效果 |
|---|---|---|
| 细粒度更新 | 拆分数据模型 | 减少不必要的更新 |
| 延迟加载 | 按需创建实例 | 提高初始化速度 |
| 批量更新 | 合并多次更新 | 减少渲染次数 |
5.2 性能优化示例
@Observed
class OptimizedModel {private updateQueue: Array<() => void> = [];private isUpdating: boolean = false;// 批量更新方法batchUpdate(updates: Array<() => void>) {this.updateQueue.push(...updates);if (!this.isUpdating) {this.isUpdating = true;Promise.resolve().then(() => {this.processUpdates();});}}private processUpdates() {while (this.updateQueue.length > 0) {const update = this.updateQueue.shift();update();}this.isUpdating = false;}
}
5.3 最佳实践建议
-
状态粒度
- 适当拆分状态模型
- 避免过度耦合
- 保持状态的单一职责
-
更新策略
- 使用批量更新
- 实现防抖/节流
- 避免频繁小更新
-
内存管理
- 及时清理不需要的观察者
- 避免循环引用
- 合理使用弱引用
-
调试与监控
- 添加状态变化日志
- 监控更新性能
- 实现状态快照
通过合理使用@Observed装饰器和遵循这些最佳实践,可以构建出高效、可维护的响应式应用。在实际开发中,要根据具体需求选择合适的状态管理策略,并持续优化性能表现。
相关文章:
81.HarmonyOS NEXT 状态管理与响应式编程:@Observed深度解析
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT 状态管理与响应式编程:Observed深度解析 文章目录 HarmonyOS NEXT 状态管理与响应式编程:Observed深度解析…...
【Agent】OpenManus-Agent架构详细分析
各组件详细设计见: BaseAgent:BaseAgentReActAgent:ReActAgentToolCallAgent:ToolCallAgent具体Agent实现:具体AgentMemory数据结构:Memory 1. 智能体层次结构 OpenManus 采用了一个多层次的智能体继承结…...
股指期货有卖不出去的时候吗?
在股指期货的交易世界里,很多人都有这样的疑问:股指期货会不会有卖不出去的时候呢?答案是会的,下面咱们就来详细唠唠为啥会出现这种情况。 市场极端行情下难以卖出 1.跌停限制:股指期货和股票一样,也有涨…...
前端Html5 Canvas面试题及参考答案
目录 Canvas 元素的默认尺寸是多少?如何正确设置其宽高以避免图像拉伸? 如何获取 Canvas 的 2D 上下文对象?3D 上下文支持哪些技术? canvas.width 与 canvas.style.width 的区别是什么? Canvas 支持的图像格式有哪些?如何将 Canvas 转换为 Base64 图片? Canvas 中如…...
【ES6】03-Set + Map
本文介绍两种集合 set map 的操作和方法。 目录 1. Set 1.1 set基本使用 1.2 add 1.3 delete 1.4 has 1.5 size 1.6 set转换为数组 1.7 拓展运算符 1.8 for...of 1.9 forEach 1.10 set给数组去重 2. Map 2.1 创建map集合 2.2 set添加元素 2.3 delete删除元素 …...
Java缓存String(字符串常量池)、Integer (-128 到 127 )
对问题的解释 1. “字符串常量池存储的是string对象的直接引用,而不是直接存放的对象,是一张string table” 的含义 这句话可以从以下几个方面理解: (1) 字符串常量池的存储内容 直接引用:字符串常量池中存储的是指向实际 Stri…...
消息队列的特性与使用场景:Kafka、ActiveMQ、RabbitMQ与RocketMQ的深度剖析
在分布式系统和微服务架构中,消息队列是实现服务间通信和解耦的核心组件。Kafka、ActiveMQ、RabbitMQ和RocketMQ是当前最受欢迎的消息队列解决方案,它们各自具有独特的特性和适用场景。本文将从特性和使用场景两个维度进行对比分析,帮助读者更…...
开发、科研、日常办公工具汇总(自用,持续更新)
主要记录汇总一下自己平常会用到的网站工具,方便查阅。 update:2025/2/11(开发网站补一下) update:2025/2/21(补充一些AI工具,刚好在做AI视频相关工作) update:2025/3/7&…...
解决VueI18n使用浏览器插件翻译后,切换国际化失效的问题
问题复现 在使用Vue-i18n对页面进行国际化的时候,使用浏览器翻译插件(如腾讯翻译)后,切换国际化语言,随后当我们关闭浏览器翻译插件后,再次切换国际化语言,原来被翻译的文字无法正确切换 出现…...
HTML5 drag API实现列表拖拽排序
拖拽API(Drag and Drop API)是HTML5提供的一组功能,使得在网页上实现拖放操作变得更加简单和强大。这个API允许开发者为网页元素添加拖拽功能,用户可以通过鼠标将元素拖动并放置到指定的目标区域。 事件类型 dragstart࿱…...
改变一生的思维模型【11】升维
升维思维模型:突破认知局限的破局法则 一、定义与核心逻辑 升维思维是通过增加分析维度,将问题投射到更高认知层次寻找解决方案的思考方式。其本质是跳出原有竞争维度,在更广阔的空间重构游戏规则。核心逻辑在于:当低维战场陷入…...
【动手学深度学习】#2线性神经网络
主要参考学习资料: 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 目录 2.1 线性回归2.1.1 线性回归的基本元素线性模型损失函数解析解随机梯度下降 2.1.3 最大似然估计 2.2 线性回归从零开始实现2.2.1 生成数据集2.2.2 读取数…...
计算机网络——NAT
一、什么是NAT? NAT(Network Address Translation,网络地址转换) 是一种将 私有IP地址 与 公有IP地址 相互映射的技术,主要用于解决IPv4地址不足的问题。它像一名“翻译官”,在数据包经过路由器或防火墙时…...
Stable Deffusion--常见模型插件详解
1.Checkpoint大模型 Checkpoint 是生成图像的基础模型,决定了整体画风如动漫、写实、机甲等。它是必选项,所有图像生成必须基于一个主模型。文件体积较大通常 1.5GB 以上,格式为 .ckpt 或 .safetensors。 存放位置为:\models\Sta…...
防重复提交详解:从前端Vue到后端Java的全面解决方案
防重复提交详解:从前端Vue到后端Java的全面解决方案 一、重复提交问题概述 在Web应用开发中,表单重复提交是一个常见问题,可能导致: 数据库中出现重复记录重复执行业务逻辑(如多次扣款)系统资源浪费用户…...
同一子网通信
添加交换机后的通信流程 1. 同一子网内(使用交换机) 判断是否在同一子网: 主机A通过子网掩码判断主机B的IP地址是否属于同一子网。若在同一子网,主机A需要通过ARP获取主机B的MAC地址。 ARP请求(广播)&…...
快速迭代:利用 nodemon 和其他工具实现 Express.js 热更新
在开发 Express.js 应用时,热更新(Hot Reloading)可以显著提升开发效率,因为它允许你在修改代码后立即看到效果,而无需手动重启服务器。以下是几种实现热更新的方法和工具,帮助你在开发过程中更高效地工作。…...
BUG日志:Maven项目启动报错(文件名或者文件扩展名过长)
Bug日志编号:[Maven-001] 标题:Windows系统下Maven项目因路径过长导致命令行执行失败 1. 问题描述 现象:执行mvn clean install时报错: The input line is too long 或 The filename or extension is too long触发条件…...
IntelliJ IDEA 快捷键系列:重命名快捷键详解
目录 引言一、默认重命名快捷键1. Windows 系统2. Mac 系统 二、操作步骤与技巧1. 精准选择重命名范围2. 智能过滤无关内容 三、总结 引言 在代码重构中,重命名变量、类、方法 是最常用的操作之一。正确使用快捷键可以极大提升开发效率。本文针对 Ma…...
零基础掌握分布式ID生成:从理论到实战的完整指南 [特殊字符]
一、为什么需要分布式ID? 🤔 在单机系统中,使用数据库自增ID就能满足需求。但在分布式系统中,多个服务节点同时生成ID时会出现以下问题: ID冲突:不同节点生成相同ID 扩展困难:数据库自增ID无法…...
使用python反射,实现pytest读取yaml并发送请求
pytest yaml yaml - feature: 用户模块story: 登录title: 添加用户request:method: POSTurl: /system/user/listheaders: nullparams: nullvalidate: nullread_yaml_all def read_yaml_all(path):with open(path, r, encodingutf-8) as f:value yaml.safe_load(f)return v…...
点灯、点各式各样的灯
鱼离水则身枯,心离书则神索。 前言闪灯呼吸灯流水灯二进制数显示灯蜂鸣器节拍流水音乐会总结 前言 上回书咱们简单了解了一点有关特殊功能寄存器sfr、通用输入输出GPIO、位操作运算符sbit和一个不靠单片机上的晶振(拿来定时的)的依托于单片机CPU空操作的ms级延时函…...
Matlab 汽车悬架系统动力学建模与仿真
1、内容简介 略 Matlab 170-汽车悬架系统动力学建模与仿真 可以交流、咨询、答疑 2、内容说明 略 本文对题目给定的1/2汽车四自由度模型,建立状态空间模型进行系统分析,并通过MATLAB仿真对系统进行稳定性、可控可观测性分析,对得的结果进行…...
专访数势科技谭李:智能分析 Agent 打通数据平权的最后一公里
作者|斗斗 编辑|皮爷 出品|产业家 伦敦塔桥下的泰晤士河底,埋藏着工业革命的隐秘图腾——布鲁内尔设计的隧道盾构机。在19世纪城市地下轨道建设的过程中,这个直径11米的钢铁巨兽没有选择拓宽河道,而是开创了地下通行的新维度。 “我们不…...
了解浏览器
本文来自腾讯元宝 Chrome浏览器(Google Chrome)是由Google开发的一款免费网页浏览器,自2008年发布以来凭借其高效、安全、简洁的特点成为全球市场份额最高的浏览器。以下是其核心信息及最新动态的综合分析: 一、核心优势与技术特点…...
2、操作系统之软件基础
一、硬件支持系统 ,系统管理硬件 操作系统核心功能可以分为: 守护者:对硬件和软件资源的管理协调者:通过机制,将各种各样的硬件资源适配给软件使用。 所以为了更好的管理硬件,操作系统引进了软件。其中3大…...
STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据电脑通过串口控制LED
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.15 51单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED 前言…...
K8S下nodelocaldns crash问题导致域名请求响应缓慢
前言 最近做项目,有业务出现偶发的部署导致响应很慢的情况,据了解,业务使用域名访问,相同的nginx代理,唯一的区别就是K8S重新部署了。那么问题大概率出现在容器平台,毕竟业务是重启几次正常,偶…...
CVPR2024 | TT3D | 物理世界中可迁移目标性 3D 对抗攻击
Towards Transferable Targeted 3D Adversarial Attack in the Physical World 速览总结摘要-Abstract引言-Introduction相关工作-Related Work方法-MethodologyPreliminray-预备知识问题表述-Problem FormulationNeRF参数空间中的双重优化-Dual Optimization in NeRF Paramete…...
全面对比分析:HDMI、DP、DVI、VGA、Type-C、SDI视频接口特点详解
在当今的多媒体时代,视频接口的选择对于设备连接和显示效果至关重要。不同的视频接口在传输质量、兼容性、带宽等方面各有优劣。本文将全面对比分析常用的视频接口HDMI、DP、DVI、VGA、Type-C、SDI,帮助读者更好地理解它们的特点和适用场景。 一、HDMI&…...
