优雅的@ObservedV2和@Trace装饰器

Hello,大家好,我是 V 哥。在HarmonyOS NEXT开发中,@ObservedV2装饰器和@Trace装饰器是用于状态管理的两个装饰器,它们在HarmonyOS应用开发中用于增强对类对象中属性的观测能力。如果你学过观察者模式的原理,你会更容易理解和上手,以下是它们的一些关键特性和使用注意事项:

@ObservedV2和@Trace装饰器的关键特性

@ObservedV2装饰器

  • 需要放在类的定义前,使用new创建类对象。
  • 单独使用@ObservedV2装饰器没有任何作用,需要与@Trace装饰器配合使用。
  • 在嵌套类中,嵌套类中的属性被@Trace装饰且嵌套类被@ObservedV2装饰时,才具有触发UI刷新的能力。
  • 在继承类中,父类或子类中的属性被@Trace装饰且该属性所在类被@ObservedV2装饰时,才具有触发UI刷新的能力。
  • 未被@Trace装饰的属性用在UI中无法感知到变化,也无法触发UI刷新。
  • @ObservedV2的类实例目前不支持使用JSON.stringify进行序列化。

@Trace装饰器

  • 用于装饰被@ObservedV2装饰的class中的属性,使得属性具有深度观测的能力。
  • 可以装饰的变量类型包括numberstringbooleanclassArrayDateMapSet等类型。
  • 被@Trace装饰器装饰的属性变化时,仅会通知属性关联的组件进行刷新。
使用注意事项
  • 要监听的属性要添加@Trace装饰器。
  • 被监听的属性所在的类要添加@ObservedV2。
  • 继承类中,继承其中的被监听的属性时,可以等价视为是给出自己的类添加了@Trace装饰器监听。
  • @ObservedV2的类实例目前不支持使用JSON.stringify进行序列化,至于原因是啥,V哥在文末解释。
  • 继承自@ObservedV2的类无法和@State等V1的装饰器混用,运行时报错。

业务场景代码案例

假设我们有一个电商应用,需要展示商品的名称和价格,并且当价格更新时,界面能够响应变化。

// 商品类,被@ObservedV2装饰,表示这是一个需要被观测的类
@ObservedV2
class Product {
  // 商品名称,被@Trace装饰,表示这个属性的变化需要被观测
  @Trace name: string;

  // 商品价格,被@Trace装饰,表示这个属性的变化需要被观测
  @Trace price: number;

  constructor(name: string, price: number) {
    this.name = name;
    this.price = price;
  }
}

// 组件类,用于展示商品信息
@ComponentV2
struct ProductComponent {
  // 商品实例,使用@Local装饰,表示这是一个局部状态
  @Local product: Product = new Product("V哥小炒肉", 100);

  build() {
    Column() {
      Text(`Name: ${this.product.name}`)
        .fontSize(30)
        .fontWeight(FontWeight.Bold);
      Text(`Price: ¥${this.product.price}`)
        .fontSize(30)
        .fontWeight(FontWeight.Bold);
      Button("更新价格")
        .onClick(() => {
          // 更新商品价格,由于price被@Trace装饰,UI将响应这一变化
          this.product.price += 10;
        });
    }
    .width('100%')
    .height('100%');
  }
}

// 入口函数,启动应用
@Entry
@ComponentV2
struct Index {
  build() {
    Row() {
      ProductComponent();
    }
  }
}

在这个例子中,Product类被@ObservedV2装饰,表示这是一个需要被观测的类。nameprice属性被@Trace装饰,表示这些属性的变化需要被观测。在ProductComponent组件中,我们创建了一个Product实例,并在UI中展示它的nameprice。当用户点击按钮时,price属性的值增加,由于它被@Trace装饰,UI将自动响应这一变化并刷新显示新的价格。

优势

  • 相比V1版本,V2版本提供了更强大的状态管理能力,包括深度观测和深度监听,以及更灵活的装饰器使用。
  • V2版本增强了观测性能和装饰器的易用性,更有利于组件化开发。

所以建议在开发中使用 V2版本。

为什么@ObservedV2不支持JSON.stringify?

@ObservedV2不支持JSON.stringify的原因主要有两个方面:

  1. 复杂数据结构和监听器:HarmonyOS的@ObservedV2类实例设计用于响应式编程,通常用于UI框架中的数据绑定。其内部可能包含复杂的数据结构和监听器,这些都不适合直接通过JSON.stringify进行序列化。JSON.stringify主要用于处理简单数据结构,如对象、数组、字符串等,而复杂对象(如包含函数、循环引用或特定类实例)可能无法正确序列化。

  2. 序列化后会有__ob_前缀的问题:被@ObservedV2标记的类及字段,使用JSON.stringify之后字段名称都加上了“__ob_”开头的字段,导致无法反序列化回来。这是因为@ObservedV2装饰器在类实例上添加了一些内部属性和方法来实现响应式功能,这些属性和方法在序列化时会产生问题。

针对@ObservedV2对象,建议通过手动提取需要序列化的数据字段,或者自定义序列化逻辑来转换数据。如果问题依旧没法解决,可能需要考虑其他的数据传递或存储方案。

最后

这些装饰器的引入,使得HarmonyOS应用开发中的状态管理更加灵活和强大,尤其是在处理复杂对象和深层次属性变化时,提供了更好的解决方案。关注威哥爱编程,一起鸿蒙起来。鸿蒙你我他,生态靠大家。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网安全-ARMv8-M Trustzone 实操

前言 本文针对ARMv8m架构M23/M33 MCU安全特性使用进行介绍,以nxp LPC55xx系列和STM32L5xx系列为例,为大家阐述如何使用Trustzone技术提高物联网设备安全性,适合有一定平台安全基础的物联网设备开发人员、安全方案开发人员。 背景 为了提升平台安全性,ARM推出了ARMv8m架构…

昱感微“多维像素”多模态融合感知展示

昱感微采用“多维像素”多模态融合技术,将可见光摄像头、红外摄像头、4D毫米波雷达/激光雷达的探测数据以“多维像素”的数据格式输出:图像数据雷达探测数据红外传感器探测数据叠加,以摄像头像素为颗粒度组合全部感知数据,形成多模…

Launcher添加hotseat图标布局

Launcher的hotseat客户要求添加一些指定应用图标。 首先打开机器将要布局的图标手动移动到hotseat位置上面。 然后使用adb命令将data/data/com.android.launcher3/databases这个文件pull出来。这个文件夹是Luancher的数据库文件。里面保存了相关应用的图标信息。 使用SQLiteS…

GNSS误差源及差分定位

GNSS误差源: (一)卫星星历误差 由星历信息所得出的卫星位置坐标与实际位置坐标的偏差就是星历误差。星历信息是由 GPS 地面部分测量计算后传入空间部分的。由于卫星在运动中要受到各种摄动力的作用, 而地面部分又很难精确测量这些作用力,…

【数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】

目录😋 任务描述 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现希尔排序算法。 测试说明 平台会对你编写的代码进行测试: 测试输入示例: 10 9 8 7 6 5 4 3 2 1 0 (说明:第一行是元素个数&a…

通俗易懂的 Nginx 反向代理 配置

通俗易懂的 Nginx 反向代理 配置 首先 root 与 alias 的区别 root 是直接拼接 root location location /i/ {root /data/w3; }当请求 /i/top.gif ,/data/w3/i/top.gif 会被返回。 alias 是用 alias 替换 location location /i/ {alias /data/w3/images/; }当请…

网页爬虫技术全解析:从基础到实战

引言 在当今信息爆炸的时代,互联网上的数据量每天都在以惊人的速度增长。网页爬虫(Web Scraping),作为数据采集的重要手段之一,已经成为数据科学家、研究人员和开发者不可或缺的工具。本文将全面解析网页爬虫技术&…

分页查询和事务管理

前端需要给后端传递的参数: page:当前页码,用于指定用户想要查看的页。pageSize:每页展示记录数,用于指定每页应显示多少条记录。 后端需要给前端返回的结果: total:总记录数,用于告…

MATLAB深度学习(七)——ResNet残差网络

一、ResNet网络 ResNet是深度残差网络的简称。其核心思想就是在,每两个网络层之间加入一个残差连接,缓解深层网络中的梯度消失问题 二、残差结构 在多层神经网络模型里,设想一个包含诺干层自网络,子网络的函数用H(x)来表示&#x…

go语言zero框架调用自己的安装的redis服务配置与使用

在 Go 语言中调用自己安装的 Redis 服务,可以分为几个步骤:从安装 Redis 服务到配置、启动 Redis,最后在 Go 代码中连接并使用 Redis。以下是详细的步骤: ## 1. 安装 Redis 服务 ### 1.1 在 Linux 系统上安装 Redis 假设你使用…

Cerebras 推出 CePO,填补推理与规划能力的关键空白

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Google Cloud Database Option(数据库选项说明)

关系数据库 在关系数据库中,信息存储在表、行和列中,这通常最适合结构化数据。因此,它们用于数据结构不经常更改的应用程序。与大多数关系数据库交互时使用 SQL(结构化查询语言)。它们为数据提供 ACID 一致性模式&am…

ArcGIS将MultiPatch数据转换为Obj数据

文章目录 ArcGIS将MultiPatch数据转换为Obj数据1 效果2 技术路线2.1 Multipatch To Collada2.2 Collada To Obj3 代码实现4 附录4.1 环境4.2 一些坑ArcGIS将MultiPatch数据转换为Obj数据 1 效果 2 技术路线 MultiPatch --MultipatchToCollada–> Collada --Assimp–> O…

微信小程序5-图片实现点击动作和动态加载同类数据

搜索 微信小程序 “动物觅踪” 观看效果 感谢阅读,初学小白,有错指正。 一、功能描述 a. 原本想通过按钮加载背景图片,来实现一个可以点击的搜索button,但是遇到两个难点,一是按钮大小调整不方便(网上搜索…

使用nmap确定扫描目标

nmap可以通过IP、主机名、域名等指定单一目标,也可以使用IP范围、列表文件、等指定多个IP。 单一目标 IP nmap IP主机名 nmap hostname域名 nmap domainname,可以通过--dns-server指定dns服务器地址,也可以通过--system-dns指定使用操作系统…

【C++】关联存储结构容器-set(集合)详解

目录 一、基本概念 二、内部实现 三、常用操作 3.1 构造函数 3.2 插入操作 3.3 删除操作 3.4 查找操作 3.5 访问元素 3.6 容量操作 3.7 交换操作 四、特性 五、应用场景 结语 一、基本概念 set是C标准模板库(STL)中的一种关联容器&#xf…

ssm-day03 aoptx

AOP AOP指的是面向对象思想编程问题的一些补充和完善 soutp、soutv 解耦通俗理解就是把非核心代码剥出来,减少对业务功能代码的影响 设计模式是解决某些特定问题的最佳解决方案,后面一点要记得学这个!!! cxk唱跳哈…

谷粒商城—分布式高级①.md

1. ELASTICSEARCH 1、安装elastic search dokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2(2)配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "h…

数据仓库的性能问题及解决之道

随着数据量不断增长和业务复杂度逐渐攀升,数据处理效率面临巨大挑战。最典型的表现是面向分析型场景的数据仓库性能问题越来越突出,压力大、性能低,查询时间长甚至查不出来,跑批跑不完造成生产事故等问题时有发生。当数据仓库出现…

云和恩墨 zCloud 与华为云 GaussDB 完成兼容性互认证

近日,云和恩墨(北京)信息技术有限公司(以下简称:云和恩墨)的多元数据库智能管理平台 zCloud 与华为云计算技术有限公司(以下简称:华为云)的 GaussDB 数据库完成了兼容性互…