Harmony 状态监听 @Monitor和@Computed

@Monitor与@Computed装饰器在ArkUI状态管理中的协同应用

一、装饰器概述

1. @Monitor装饰器

@Monitor是ArkUI状态管理V2中的核心装饰器,用于深度监听状态变量的修改:

  • 支持监听嵌套类属性、多维数组项和对象数组中的指定项变化
  • 能够获取变化前后的值进行比较
  • 支持同时监听多个属性变化
  • 适用于@ComponentV2装饰的自定义组件和@ObservedV2装饰的类

2. @Computed装饰器

@Computed是用于优化性能的计算属性装饰器:

  • 自动检测依赖属性的变化并重新计算
  • 计算结果会被缓存,减少重复计算开销
  • 只能装饰getter方法,不允许赋值操作
  • 解决UI多次重用属性导致的性能问题

二、协同工作机制

1. 数据流协同

@ObservedV2
class Temperature {@Trace celsius: number = 20;@Computedget fahrenheit(): number {return this.celsius * 9/5 + 32;}@Computed get kelvin(): number {return (this.fahrenheit - 32) * 5/9 + 273.15;}
}@Entry
@ComponentV2
struct TempView {@Local temp: Temperature = new Temperature();@Monitor('temp.kelvin')onTempChange(mon: IMonitor) {console.log(`Kelvin变化: ${mon.value()?.before} → ${mon.value()?.now}`);}build() {Column() {Button("增加温度").onClick(() => this.temp.celsius++)Text(`摄氏: ${this.temp.celsius.toFixed(1)}℃`)Text(`华氏: ${this.temp.fahrenheit.toFixed(1)}℉`)Text(`开氏: ${this.temp.kelvin.toFixed(1)}K`)}}
}

2. 典型工作流程

  1. 基础状态变量(@Local/@Trace)变化
  2. 触发关联的@Computed属性重新计算
  3. @Monitor监听到计算属性变化
  4. 执行@Monitor回调中的业务逻辑
  5. 更新依赖这些属性的UI组件

三、实际应用场景

1. 购物车总价计算

@ObservedV2
class CartItem {@Trace price: number = 0;@Trace quantity: number = 1;
}@ObservedV2
class ShoppingCart {@Type(CartItem)@Trace items: CartItem[] = [];@Computedget total(): number {return this.items.reduce((sum, item) => sum + (item.price * item.quantity), 0);}@Computedget hasDiscount(): boolean {return this.total > 1000;}@Monitor('total', 'hasDiscount')onCartUpdate(mon: IMonitor) {mon.dirty.forEach(path => {console.log(`${path} 变化: ${mon.value(path)?.before} → ${mon.value(path)?.now}`);});}
}

2. 表单验证

@ObservedV2
class UserForm {@Trace username: string = '';@Trace password: string = '';@Trace confirmPwd: string = '';@Computedget isValid(): boolean {return this.username.length >= 6 && this.password.length >= 8 &&this.password === this.confirmPwd;}@Monitor('isValid')onValidChange(mon: IMonitor) {if (mon.value()?.now) {console.log('表单验证通过');}}
}

四、性能优化建议

  1. 计算复杂度控制:保持@Computed方法简洁,避免复杂运算
  2. 监听范围精确:只监听必要的属性,避免过度监听
  3. 避免循环依赖:防止@Computed属性间相互引用导致死循环
  4. 合理使用缓存:利用@Computed的缓存特性减少重复计算
  5. 异步操作分离:不在@Monitor回调中执行耗时操作

五、与V1装饰器对比

特性@Watch(V1)@Monitor(V2)
监听目标单个状态变量多个状态变量
深度监听仅第一层属性支持深层嵌套
变化值获取不支持支持前后值
执行时机属性变更后属性变更后
装饰对象回调方法名回调方法本身

六、最佳实践

  1. 分层设计
// Model层
@ObservedV2
class DataModel {@Trace rawData: number[] = [];@Computedget processedData(): number[] {return this.rawData.map(x => x * 2);}
}// ViewModel层
class ViewModel {model: DataModel = new DataModel();@Monitor('model.processedData')onDataUpdate(mon: IMonitor) {// 处理数据变化逻辑}
}// View层
@ComponentV2
struct DataView {@Provide viewModel: ViewModel = new ViewModel();build() {// UI渲染}
}
  1. 类型安全
@ObservedV2
class TypedModel<T> {@Trace value: T;@Computedget formattedValue(): string {return String(this.value);}
}
  1. 调试技巧
@Monitor('someProperty')
debugMonitor(mon: IMonitor) {console.group('属性变化追踪');mon.dirty.forEach(path => {console.log(`路径: ${path}`);console.log('旧值:', mon.value(path)?.before);console.log('新值:', mon.value(path)?.now);});console.groupEnd();
}

结语

@Monitor和@Computed装饰器的协同使用为ArkUI应用提供了强大的状态管理能力。通过合理运用这两个装饰器,开发者可以实现:

  • 高效的数据变化监听
  • 自动化的计算属性更新
  • 精细化的UI更新控制
  • 清晰的代码结构分层

掌握它们的协同工作机制,能够显著提升应用性能和维护性,是开发高质量HarmonyOS应用的关键技能之一。

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

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

相关文章

同济大学多模态感知具身导航全面综述

作者&#xff1a; I-Tak Ieong, Hao Tang 单位&#xff1a;同济大学计算机学院&#xff0c;北京大学计算机学院 论文标题&#xff1a; Multimodal Perception for Goal-oriented Navigation: A Survey 论文链接&#xff1a;https://arxiv.org/pdf/2504.15643 主要贡献 基于…

2025年CCF先进音频技术竞赛

由中国计算机学会主办、CCF语音对话与听觉专委会承办、语音之家协办、华为终端有限公司赞助的CCF先进音频技术大赛正式启动。大赛旨在推动国内高等院校及科研院所在音频技术领域的专业人才培养&#xff0c;支持学生科技创新&#xff0c;选拔优秀人才。 赛事官网&#xff1a;ht…

手撕线程池

线程池的目的&#xff1a; 1.复用线程&#xff0c;减少频繁创建和销毁的开销 创建和销毁线程是昂贵的系统操作&#xff0c;涉及内核调度、内存分配&#xff1b; 使用线程池预先创建一批线程&#xff0c;在多个任务间循环复用&#xff0c;避免资源浪费&#xff0c;提高性能。 …

3DTiles三维模型

1. 3DTiles 介绍​ 2016 年&#xff0c;Cesium 团队借鉴传统 2DGIS 的地图规范&#xff1a;WMTS&#xff0c;借鉴图形学中的层次细节模型&#xff0c;打造出大规模的三维数据标准&#xff1a;3d-Tiles&#xff0c;中文译名&#xff1a;三维瓦片。 它在模型上利用了 gltf 渲染…

Golang Kratos 系列:业务分层的若干思考(一)

在使用 Kratos 框架开发云服务的过程中&#xff0c;渐渐理解和感受到“领域层”这个概念和抽象的强大之处&#xff0c;它可以将业务和存储细节解耦、将业务和开发初期频繁变更的API结构&#xff0c;让Mock单元测试变得更加容易、对细节的变化更鲁棒。让业务代码摆脱技术细节依赖…

深度优化OSS上传性能:多线程分片上传 vs 断点续传实战对比

1 卸载开头 对象存储服务&#xff08;OSS&#xff09;已成为现代应用架构的核心组件&#xff0c;但随着业务规模扩大&#xff0c;文件上传性能问题日益凸显。本文将深入探讨两种核心优化技术&#xff1a;多线程分片上传和断点续传&#xff0c;通过理论分析、代码实现和性能测试…

doris_工作使用整理

文章目录 前言一、doris整体情况二、doris的存储过程情况1.分类2. 同步物化视图3. 异步物化视图三,分区相关1.分区建的过多前言 提示:doris使用版本3.x 提示:以下是本篇文章正文内容,下面案例可供参考 一、doris整体情况 细节放大 二、doris的存储过程情况 1.分类 按…

左神算法之单辅助栈排序算法

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 请编写一个程序&#xff0c;对一个栈里的整型数据&#xff0c;按升序进行排序&#xff08;即排序前栈里的数据是无序的&#xff0c;排序后最大元素位于栈顶&#xff09;。要求最多只能使用一个额外的栈存放临时数据&#xf…

使用Trae编辑器与MCP协议构建高德地图定制化服务

目录 一、使用Trae编辑器配置高德MCP Server 1.1 Trae介绍 1.2 从mcp.so中获取配置高德地图mcp server配置信息 1.3 高德地图开发者配置 1.4 添加Filesystem 到Trae 1.5 使用结果展示 1.6 MCP常见命令行工具和包管理说明 1.7 Function Call工具和MCP技术对比 二、本地…

【LLaMA-Factory 实战系列】三、命令行篇 - YAML 配置与高效微调 Qwen2.5-VL

【LLaMA-Factory 实战系列】三、命令行篇 - YAML 配置与高效微调 Qwen2.5-VL 1. 引言2. 为什么从 WebUI 转向命令行&#xff1f;3. 准备工作&#xff08;回顾&#xff09;4. 核心&#xff1a;创建并理解训练配置文件4.1 选择并复制基础模板4.2 逐一解析与修改配置文件4.3 参数详…

推荐:ToB销售B2B销售大客户营销大客户销售培训师培训讲师唐兴通讲销售技巧数字化销售销AI销售如何有效获取客户与业绩

站在AI浪潮之巅&#xff0c;重塑销售之魂 在AI时代&#xff0c;普通销售人员&#xff08;TOB、TOC&#xff09;除了传统的销售动作之外&#xff0c;还能做什么&#xff1f;怎么做&#xff1f; 这是《AI销冠》这本书想探讨的核心问题。 特别喜欢编辑老师总结的&#xff1a; 读者…

爬取小红书相关数据导入到excel

本期我们来进行实战,爬取小红书的相关数据导入到excel中,后续可进行些数据分析,今后或者已经在运营小红书的小伙伴应该比较喜欢这些数据。今天我们的主角是DrissionPage,相对于之前介绍的selenium省去了很多的配置,直接安装了就能使用。 DrissionPage 是一个基于 python …

c++面试题每日一学记录- C++对象模型与内存对齐深度原理详解

一、C++对象模型核心原理 1. 对象内存布局基础原理 设计哲学: 零开销原则:不为未使用的特性付出代价(如无虚函数则无vptr)兼容性:C结构体在C++中保持相同内存布局多态支持:通过虚函数表实现运行时动态绑定内存布局实现机制: 编译器处理步骤: 成员排列:严格按声明顺序…

Kafka 监控与调优实战指南(二)

五、Kafka 性能问题剖析 5.1 消息丢失 消息丢失是 Kafka 使用过程中较为严重的问题&#xff0c;可能由多种原因导致。在生产者端&#xff0c;如果配置不当&#xff0c;比如将acks参数设置为0&#xff0c;生产者发送消息后不会等待 Kafka broker 的确认&#xff0c;就继续发送…

Linux下SVN报错:Unable to connect to a repository at URL ‘svn://XXX‘

一、问题描述 Linux下通过SVN执行提交&#xff08;commit&#xff09;操作时报错&#xff1a;Unable to connect to a repository at URL svn://XXX&#xff1a; 二、解决方法 导致该问题的一个可能原因是远程仓库的URL发生变化了&#xff0c;即svn服务器的ip变更了。这时可…

Modbus 扫描 从站号、波特率

下载链接&#xff1a;https://pan.quark.cn/s/533ceb8e397d 下载链接: https://pan.baidu.com/s/1PQHn-MwfzrWgF2UrXQDoGg 提取码: 1111

Docker 容器通信与数据持久化

目录 简介 一、Docker 容器通信 1. Docker 网络模式 2. Bridge 模式 3. Host 模式 4. Container 模式 5. Overlay 模式 6. 端口映射&#xff1a;容器与外部的桥梁 7. 容器互联&#xff1a;从 --link 到自定义网络 二、Docker 数据持久化 1. 数据卷&#xff1a;Docke…

【教学类-89-08】20250624新年篇05——元宵节灯笼2CM黏贴边(倒置和正立数字 )

背景需求&#xff1a; 【教学类-89-06】20250220新年篇05——元宵节灯笼2CM黏贴边&#xff08;3边形到50边形&#xff0c;一页1图、2图、4图&#xff0c;适合不同水平&#xff0c;适合不同阶段&#xff09;-CSDN博客文章浏览阅读1.6k次&#xff0c;点赞35次&#xff0c;收藏27…

【DB2】SQL0104N An unexpected token “OCTETS“ was found following “……

db2创建表时报标题的错误&#xff0c;建表语句如下 db2 "CREATE TABLE YS.TEST_1(ID VARCHAR(64 OCTETS))"去掉octets就好了 经过测试&#xff0c;在9.7版本报错&#xff0c;在10.5.11没问题&#xff0c;怀疑版本差异导致 在官网查找资料&#xff0c;应该是10.5才…

暴雨以信创委员会成员单位身份参与南京专题活动

6月19日&#xff0c;中国电子工业标准化技术协会信息技术应用创新工作委员会&#xff08;简称信创工委会&#xff09;联合南京市工业和信息化局共同举办的“智启未来&#xff1a;AI赋能信息技术应用创新办公新势力”专题活动在南京成功举办。南京市工业和信息化局副局长代吉上、…