HarmonyOS 鸿蒙应用开发基础:@Watch装饰器详解及与@Monitor装饰器对比分析
在鸿蒙系统的开发中,状态管理和组件之间的通信是至关重要的部分。为此,鸿蒙提供了多种装饰器来帮助开发者监听和处理数据变化。今天我们将深入探讨@Watch装饰器,并与新的状态管理组件V2中的@Monitor装饰器进行对比。
@Watch装饰器详解
基本概念
@Watch装饰器是一种在鸿蒙开发中用于监听状态变量变化的工具。当被监听的状态变量发生变化时,会自动触发指定的回调函数。
主要特点
- 数据变化监听:可以监听使用@State、@Link、@Prop等装饰器修饰的变量变化。
- 自动触发回调:当监听的变量发生变化时,会自动执行指定的回调函数。
- 支持多个监听:一个组件可以同时监听多个变量的变化。
使用示例
1. 基本用法
@Component
struct WatchExample {@State count: number = 0;@Watch('onCountChange') count: number; // 监听count变量的变化onCountChange() {console.log(`Count变量变化为: ${this.count}`);}build() {Column() {Button('增加').onClick(() => {this.count++;})}}
}
2. 与@Link装饰器配合使用
@Component
struct Child {@Link @Watch('onSourceChange') sourceNumber: number;@State localMessage: string = '';onSourceChange() {this.localMessage = `Source变量变化为: ${this.sourceNumber}`;}build() {Column() {Text(this.localMessage)}}
}
3. 监听多个变量
@Component
struct MultiWatchExample {@State count: number = 0;@State message: string = '';@Watch('onCountChange') count: number;@Watch('onMessageChange') message: string;onCountChange() {console.log(`Count变量变化为: ${this.count}`);}onMessageChange() {console.log(`Message变量变化为: ${this.message}`);}build() {Column() {Button('更新Count').onClick(() => {this.count++;})Button('更新Message').onClick(() => {this.message = '新消息';})}}
}
使用场景
- 数据变化追踪
- 监听状态变化,记录历史数据,调试数据流。
- 联动更新
- 数据变化时自动更新相关数据,实现数据间的依赖关系。
- 状态同步
- 确保多个状态保持同步,必要时进行清理或初始化。
- UI更新触发
- 数据变化时触发特定的UI更新,实现复杂的交互逻辑。
注意事项
- 性能优化
- 避免在回调函数中执行过于复杂的操作。
- 监听变量过多可能影响性能。
- 循环依赖
- 避免在回调函数中直接修改被监听的变量,可能导致无限循环。
- 必须修改时,确保有适当的终止条件。
- 初始化时机
- 回调函数不会在组件初始化时触发,只有在变量值发生变化时才会被调用。
- 异步操作
- 回调函数中可以进行异步操作,但要注意状态一致性问题。
最佳实践
- 命名规范
- 回调函数名称应该清晰表达其用途。
- 建议使用on + 变量名 + Change的形式。
- 职责单一
- 每个回调函数应该只负责一个特定的功能。
- 避免在回调函数中处理过多逻辑。
- 错误处理
- 在回调函数中添加错误处理机制。
- 确保错误不会中断程序执行。
- 代码组织
- 将相关的监听逻辑组织在一起。
- 使用注释说明监听的目的和预期行为。
@Watch与@Monitor装饰器对比分析
1. 主要区别
特性 | @Watch | @Monitor |
---|---|---|
参数 | 回调方法名 | 监听状态变量名、属性名 |
监听目标数 | 只能监听单个状态变量 | 可以同时监听多个状态变量 |
监听能力 | 跟随状态变量观察能力(一层) | 跟随状态变量观察能力(深层) |
获取变化前的值 | 无法获取变化前的值 | 可以获取变化前的值 |
监听条件 | 监听对象为状态变量 | 监听对象为状态变量或为@Trace装饰的类成员属性 |
使用限制 | 仅能在@Component装饰的自定义组件中使用 | 可以在@ComponentV2装饰的自定义组件中使用,也能在@ObservedV2装饰的类中使用 |
2. @Watch的局限性
@Watch装饰器存在以下主要局限性:
- 无法监听深层属性变化
- 当状态变量是一个对象时,@Watch无法检测对象内部属性的变化。
- 无法获取变化前的值
- 只能获取变化后的值,无法进行变化前后的对比,难以实现基于变化幅度的业务逻辑。
- 只能监听单个变量
- 需要为每个变量单独定义@Watch,代码冗余,维护成本高。
3. @Monitor的优势
- 支持深层属性监听
@ObservedV2
class Info {@Trace name: string = "Tom";@Trace age: number = 25;
}@ComponentV2
struct Index {@Monitor("info.name", "info.age")onInfoChange(monitor: IMonitor) {monitor.dirty.forEach((path: string) => {console.log(`${path} 变化从前的值: ${monitor.value(path)?.before} 到现在的值: ${monitor.value(path)?.now}`);});}
}
- 可以获取变化前后的值
- 可以通过
IMonitor
对象获取变量变化前后的值。 - 适合基于变化幅度的业务逻辑实现。
- 支持多变量同时监听
- 可以在同一个回调中监听多个变量的变化。
- 减少代码冗余,简化维护工作。
4. 使用场景对比
- 简单状态监听
- @Watch:适合简单的状态变化监听。
- @Monitor:适合需要获取变化前后值或监听多个变量的场景。
- 深层属性监听
- @Watch:无法实现。
- @Monitor:可以监听嵌套对象、数组等深层属性的变化。
- 数据变化分析
- @Watch:只能知道变化后的值。
- @Monitor:可以分析变化幅度、趋势等。
- 性能优化
- @Watch:每次变化都会触发回调。
- @Monitor:在一次事件中多次改变同一属性时,只会触发一次回调。
5. 总结
通过对比,我们可以看到,@Monitor提供了更强大和灵活的状态监听能力,特别适合需要精确控制状态变化、分析数据变化趋势、实现复杂业务逻辑的场景。
理解这些装饰器的作用和限制,可以帮助开发者更好地选择合适的状态管理方案,提高开发效率和代码质量。
作者介绍
作者cdsn猫哥,blog.csdn.net/yyz_1987,转载请注明出处。
相关文章:
HarmonyOS 鸿蒙应用开发基础:@Watch装饰器详解及与@Monitor装饰器对比分析
在鸿蒙系统的开发中,状态管理和组件之间的通信是至关重要的部分。为此,鸿蒙提供了多种装饰器来帮助开发者监听和处理数据变化。今天我们将深入探讨Watch装饰器,并与新的状态管理组件V2中的Monitor装饰器进行对比。 Watch装饰器详解 基本概念…...
机器人拖动示教控制
机器人拖动示教控制 机器人拖动视角控制与轨迹记录 1. 知识目标 体验ES机器人拖动视角操作体验ES机器人拖动轨迹记录 2. 技能目标 掌握ES机器人拖动视角操作掌握ES机器人拖动轨迹记录 3. ES机器人拖动视角操作 3.1 操作步骤 点击“拖动视角”按钮长按“启用”键约3秒进入…...

免费开放试乘体验!苏州金龙自动驾驶巴士即将上线阳澄数谷
近日,苏州自动驾驶巴士线路——阳澄数谷示范线正式上线,即日起向全民免费开放试乘体验! 在苏州工业园区地铁3号线倪浜•阳澄数谷站外,一辆辆黑、白配色的小巴正在道路上有条不紊地行驶。与普通公交不同的是,小巴造型奇…...
matlab加权核范数最小化图像去噪
加权核范数最小化(Weighted Nuclear Norm Minimization, WNNM)是一种有效的图像去噪方法,它通过最小化加权核范数来促进图像的低秩近似,同时保留图像的边缘和细节信息。这种方法在去除噪声的同时,能够较好地保留图像的…...
docker容器暴露端口的作用
Docker 镜像中**暴露的端口(通过 EXPOSE 指令声明)**主要有以下作用和意义: 1. 文档化作用(Documentation) 显式声明容器内部服务监听的端口,告知用户或开发者该镜像提供的服务需要通过哪些端口通信。例如…...

每日Prompt:像素风格插画
提示词 像素风格插画,日式漫画脸,画面主体为一位站在路边的男孩,人物穿着黑色冲锋衣,手里拿着手机,男孩靠坐在机车旁边,脚边依偎着一只带着小摩托车头盔的小小猫,背景是雨中,身旁停…...

Windows逆向工程提升之二进制分析工具:HEX查看与对比技术
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 十六进制查看工具 应用于逆向工程的知识点 编辑 二进制对比工具 应用于逆向工程的知识点 十六进制查看工具 十六进制查看器是逆向工程的基础工具,它可以以十六进制格式…...
Android10如何设置ro.debuggable=1?
说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 目录 一、背景 二、如何解决? 三、操作步骤 一、背景 Android 10 开始的限制:ro.debuggable 是只读属性 从 …...

2024游戏安全白皮书:对抗激烈!PC游戏外挂功能数增长超149%,超85%移动外挂为定制挂(附获取方式)
2024 年,中国游戏市场实际销售收入达 3257.83 亿元,同比增长 7.53%;用户规模 6.74 亿人,同比增长 0.94%,再创新高。这份庞大的数据背后,更是对安全防线实力的严峻拷问。 在广东省游戏产业协会的指导下&…...
深度解析:Spark、Hive 与 Presto 的融合应用之道
目录 一、Spark分布式部署基础 1.1 Spark部署模式概述 1.2 Standalone模式部署 1.3 YARN模式部署 1.4 Kubernetes模式部署 1.5 Spark关键配置参数优化 1.6 Spark高可用配置 二、Apache Thrift 在大数据生态中的核心作用 2.1 基础概念 2.2 在大数据中的应用 2.3 Beel…...

12kV 环保气体绝缘交流金属封闭开关设备现场交流耐压试验规范
范围 本文件规定了12kV环保气体绝缘交流金属封闭开关设备现场交流耐压试验的被试设备及试验接线、试验条件、试验步骤、试验判据及异常处理方法。 本文件适用于12kV环保气体绝缘交流金属封闭开关设备现场交流耐压试验,其他气体绝缘交流金属封闭开关设备可参照执行。…...

位图算法——判断唯一字符
这道题有多种解法,可以创建hash数组建立映射关系判断,但不用新的数据结构会加分,因此我们有“加分”办法——用位图。 我们可以创建一个整型变量(32位)而一共才26个字母,所以我们只要用到0-25位即可&#…...
HarmonyOS 鸿蒙应用开发基础:父组件调用子组件方法的几种实现方案对比
在ArkUI声明式UI框架中,父组件无法直接调用子组件的方法。本文介绍几种优雅的解决方案,并作出对比分析,分析其适用于不同场景和版本需求。帮助开发者在开发中合理的选择和使用。 方案一:Watch装饰器(V1版本适用&#x…...
复盘20250522
根据行业前景、公司基本面、技术壁垒及市场催化因素的综合分析,以下两支个股最有可能持续上涨: 1. 汇得科技(机器人化工) 核心逻辑: 高增长赛道验证:公司动力电池配套产品(水冷板缓冲垫、保温…...

【UE5】环形菜单教程
效果 步骤 1. 下载图片资源:百度网盘 请输入提取码 提取码:fjjx 2. 将图片资源导入工程,如下 3. 新建3个控件蓝图,这里分别命名为“WBP_CircularMenu”、“WBP_Highlight”、“WBP_Icon” 4. 打开“WBP_Icon”,设置“所需” 添加…...

Athena 执行引擎:在线服务计算的效率王者
引言 在在线服务领域,计算任务呈现出独特的特性:一方面,数据量通常不会过于庞大,因为在线服务对耗时和响应速度有着严苛要求;另一方面,计算任务具有可控性,其大多并非由用户实时输入动态生成&a…...

飞桨paddle ‘ParallelEnv‘ object has no attribute ‘_device_id‘【已解决】
书借上回,自从我反复重装paddle之后,我发现了,只要pip list中有库,但是代码报错,那就是飞桨没把代码更新完全,只能自己去改源代码 我又遇到报错了: 根据报错信息,找到ParallelEnv报…...
Bert预训练任务-MLM/NSP
MLM MLM:Masked Language Mode:在每一个训练序列中以15%的概率随机地选中某个token进行MASK,当一个token被选中后,有以下三种处理方式: 80%的概率被[MASK],如my dog is hairy->my dog is [MASK]10%的概率修改为随机的其他token,如my dog …...

微信小程序之Promise-Promise初始用
我们来尝试使用Promise。 1、需求,做个抽奖的按钮, 抽奖规则: 30%的几率中奖,中奖会提示恭喜恭喜,奖品为10万 RMB 劳斯莱斯优惠券,没中奖会提示再接再厉。 2、先搭界面: <view class&qu…...

准备好,开始构建:由 Elasticsearch 向量数据库驱动的 Red Hat OpenShift AI 应用程序
作者:来自 Elastic Tom Potoma Elasticsearch 向量数据库现在被 “基于 LLM 和 RAG 的 AI 生成” 验证模式支持。本文将指导你如何开始使用。 Elasticsearch 已原生集成业内领先的生成式 AI 工具和服务提供商。欢迎观看我们的网络研讨会,了解如何突破 RA…...
spring的注入方式都有什么区别
目录 1. 构造器注入(Constructor Injection) 2. Setter 注入(Setter Injection) 3. 字段注入(Field Injection) 4. 接口注入(Interface Injection) 主要区别对比 最佳实践 总…...

RNN神经网络
RNN神经网络 1-核心知识 1-解释RNN神经网络2-RNN和传统的神经网络有什么区别?3-RNN和LSTM有什么区别?4-transformer的归一化有哪几种实现方式 2-知识问答 1-解释RNN神经网络 Why:与我何干? 在我们的生活中,很多事情…...

Linux | 开机自启动设置多场景实现
注:本文为“Llinux 设置开机自启”相关文章合辑。 略作重排,未整理去重。 如有内容异常,请看原文。 Linux 设置开机自启动的三种方法 幽夜卡尔 2022-10-22 一、在 /etc/rc.local 文件中添加自启动命令 编辑文件:执行以下命令&a…...

杨校老师竞赛课之青科赛GOC3-4年级组模拟题
1.山峰(程序填空)程序填空题 题目描述 编程画出山峰。 要求:两个正三角形,三角形边长分别是200、100,山峰的颜色为8号色。 int main() {// 绘制等边三角形(边长100):右转30度调整…...
设计杂谈-工厂模式
“工厂”模式在各种框架中非常常见,包括 MyBatis,它是一种创建对象的设计模式。使用工厂模式有很多好处,尤其是在复杂的框架中,它可以带来更好的灵活性、可维护性和可配置性。 让我们以 MyBatis 为例,来理解工厂模式及…...

SC3000智能相机-自动存图
1、需求:SC3000智能相机开机自动存图。相机自带的相机存储空间有限,预留存图需要开启SCMVS、并手动点存图。如果工人忘了开启则不会存图,导致生产严重失误! 2、方法:利用相机提供的FTP协议,将图自动存到本地。 1、在本地建立FTP服务器。 (1)win10默认开启了FTP服务器…...
(高级)高级前端开发者指南:框架运用与综合实战
当您已经掌握了HTML5、CSS3和JavaScript的基础知识后,接下来就是学习现代前端框架和性能优化的高级阶段。本文将重点介绍Vue.js/React的组件化开发、状态管理和路由配置,以及前端性能优化的核心技巧。通过丰富的代码示例和详细讲解,帮助您在实…...

【Java高阶面经:微服务篇】5.限流实战:高并发系统流量治理全攻略
一、限流阈值的三维度计算模型 1.1 系统容量基准线:压测驱动的安全水位 1.1.1 压力测试方法论 测试目标:确定系统在资源安全水位(CPU≤80%,内存≤70%,RT≤500ms)下的最大处理能力测试工具: 单机压测:JMeter(模拟10万并发)、wrk(低资源消耗)集群压测:LoadRunner …...

2025中青杯数学建模B题思路+模型+代码
本文将为大家带来2025年中青杯的选题建议,旨在十分钟内帮助大家快速了解每个题目具体难点、涉及模型等。初步预估赛题难度 A:B:C4:5:3初步预测选题人数 A:B:C2:1:0.6 首先是C题,忧郁症的双重防线:精准预测与有效治疗,这个题目涉及…...

记录:uniapp 上线部署到微信小程序vendorjs包过大的问题
问题: 在代码依赖分析图中,可以看到主包的容量已经超过了2M了,分包没有超! 根据网上的资料的解决方案,当前我已经做了以下相关的配置: 1.分包 2.在manifest.json的(mp-weixin)节点…...