鸿蒙应用开发:@Monitor 装饰器使用教程
文章目录一、引言二、Monitor 装饰器简介三、基本语法3.1 监听多个变量3.2 深层属性监听四、使用示例4.1 去掉 book.num 监听后的行为五、注意事项六、总结这是一个使用鸿蒙技术开发的本地原生记账应用非常适合大家用来练手。相关源码已上传至 Github点击此处查看项目。欢迎大家交流、指正也欢迎提交 PR。一、引言在鸿蒙HarmonyOS应用开发中状态管理是构建动态用户界面的核心。随着状态管理 V2的推出Monitor装饰器为开发者提供了一种更精细、更灵活的状态变化监听机制。本文将深入介绍Monitor的基本用法、高级特性以及实际应用场景帮助你更好地掌控应用状态。二、Monitor 装饰器简介Monitor是状态管理 V2 中的装饰器用于监听组件内或ObservedV2装饰类中状态变量的变化。当被监听的状态变量发生改变时会自动触发被Monitor装饰的回调函数执行。这使得开发者能够精确地响应特定数据的变化而无需在多个地方手动检查状态。三、基本语法Monitor的基本语法如下Monitor(path)onValueChange(monitor:IMonitor){// 处理变化逻辑}监听路径Monitor接受一个或多个字符串参数用于指定要监听的状态变量路径。回调函数被Monitor装饰的函数其参数monitor: IMonitor提供了变化前后的值、脏数据路径等信息。3.1 监听多个变量支持同时监听多个变量用逗号分隔Monitor(prop1,prop2)onMultiChange(monitor:IMonitor){// 处理 prop1 或 prop2 的变化}3.2 深层属性监听支持深层属性监听使用点号连接Monitor(obj.prop)onDeepChange(monitor:IMonitor){// 处理 obj.prop 的变化}四、使用示例以下示例展示如何监听对象属性的变化并在回调中获取变化前后的值ObservedV2classBook{Tracenum:number0;name:string时间简史;}EntryComponentV2struct SceneTwo{Localbook:BooknewBook();Monitor(book.num,book.name)change(monitor:IMonitor){monitor.dirty.forEach((path:string){console.info(监听${path}属性的变化变之前的值${JSON.stringify(monitor.value(path)?.before)}变后的值${JSON.stringify(monitor.value(path)?.now)}。);});}build(){Column(){Text(Name:${this.book.name}).width(320).margin(10).fontSize(20).textAlign(TextAlign.Center);Text(Index:${this.book.num}).width(320).margin(10).fontSize(20).textAlign(TextAlign.Center);Button(change).width(320).margin(10).onClick((){this.book.num;this.book.name1;});}}}在这个示例中Book类被ObservedV2装饰其属性num被Trace装饰使其成为可观察状态。组件SceneTwo中Monitor(book.num, book.name)同时监听了book.num和book.name两个属性的变化。当点击按钮时book.num和book.name发生变化change回调函数被触发并通过monitor.dirty获取所有发生变化的路径进而获取变化前后的值。运行效果4.1 去掉book.num监听后的行为如果将Monitor的参数改为只监听book.nameMonitor(book.name)change(monitor:IMonitor){// ...}此时当点击按钮触发this.book.num时change回调不会被触发而this.book.name 1同样不会触发回调。原因分析Monitor的监听机制是精确路径匹配的且被监听的对象属性必须被Trace装饰才能被精确监听。在示例中book.name属性没有使用Trace装饰因此Monitor(book.name)无法监听到name属性的变化。这体现了Monitor的精细化控制能力——开发者需要配合Trace装饰器才能精确监听特定属性的变化避免不必要的回调执行从而提升应用性能。运行效果五、注意事项在使用Monitor时需要注意以下几点Trace 装饰被监听的对象属性必须被Trace装饰否则Monitor无法监听到该属性的变化。未使用Trace的属性即使被Monitor监听也不会触发回调。异步执行Monitor是异步执行的与animateTo等动效存在冲突时可使用UIUtils.applySync等接口解决。路径写法在ObservedV2装饰的类中Monitor传入属性名即可在组件中需传入变量名.属性名实现深层监听。六、总结Monitor装饰器是鸿蒙状态管理 V2 中一个强大而灵活的工具它让开发者能够以声明式的方式精确监听状态变化从而编写出更清晰、更高效的响应式代码。通过合理运用Monitor你可以更好地控制应用的数据流提升用户体验。