鸿蒙-状态管理V2其他方法

文章目录

    • 前言
    • makeObserved
    • getTarget
    • @ObservedV2的类实例不支持JSON.stringify序列化
    • 双向绑定

前言

除了之前介绍的状态管理装饰器,在 V2 中还有其他新增的方法。

makeObserved

开发过程中我们经常会用到从服务器获取到数据(一般是 json 字符串),转化为对象,然后设置到 UI 中做展示。但有一点比较麻烦:比如我们使用 rcp做网络请求,对返回对象调用toJson() as xxx转为对象,但这样获取到的对象是没办法被观察的,因为这样创建出来的对象不会被添加代理,这时候我们就可以使用UIUtils.makeObserved(xxx)来让改对象变为可观测的。

比如:
定义两个数据类

@ObservedV2
class Person {
  @Trace name: string = ''
  @Trace age: number = 0
  @Trace static staticProp:string = ''
  @Trace address: Address = new Address()
}

@ObservedV2
class Address {
  @Trace zipCode: string = '000000'
  @Trace city: string = '北京'
}

然后我们从 json 字符串中反序列化出来对象。

aboutToAppear(): void {
  @Local jsonPerson: Person | undefined = undefined
  let personJSON: string = `
  {
  "name": "huangyuan",
  "age": 19,
  "address": {
      "zipCode": "111111",
      "city": "shangdong"
    }
  }
  `
  let tmp = JSON.parse(personJSON) as Person
  this.jsonPerson = UIUtils.makeObserved(tmp)
}

这样this.jsonPerson就是可以被观测到的对象了。当我们修改该对象的属性,对应的 UI 也可以刷新了

getTarget

  • 在状态管理中V1中,会给@Observed装饰的类对象以及使用状态变量装饰器如@State装饰的Class、Date、Map、Set、Array添加一层代理用于观测一层属性或API调用产生的变化。
  • 在状态管理V2中,会给使用状态变量装饰器如@Trace、@Local装饰的Date、Map、Set、Array添加一层代理用于观测API调用产生的变化。

我们可以使用UIUtils.getTarget(xxx)来获取到代理对象的原始对象。 但是当我们更改getTarget获取的原始对象中的内容不会被观察到变化,也不会触发UI刷新

@ObservedV2的类实例不支持JSON.stringify序列化

这个主要是针对使用new操作符创建且被@ObservedV2装饰的对象。即便是使用UIUtils.getTarget方法来获取原始对象,也不会对V2装饰器生成的前缀进行处理:

状态管理V2装饰器会为装饰的变量生成getter和setter方法,同时为原有变量名添加"_ob"的前缀。出于性能考虑,getTarget接口不会对V2装饰器生成的前缀进行处理,因此向getTarget接口传入@ObservedV2装饰的类对象实例时,返回的对象依旧为对象本身,且被@Trace装饰的属性名仍有"_ob"前缀。

来看个例子:

还是上面定义的两个数据类,被@ObservedV2修饰。
再来创建两个实例对象,一个还是和上面一样从json字符串中反序列化,另外一个使用new操作符创建。

然后我们输出一下使用JSON.stringify序列化之后的字符串

Button('makeObserved 转为json').onClick((_)=>{
  hilog.error(0x01,'StateManagerV2Page',`toJSON: ${JSON.stringify(this.jsonPerson)}`)
})
Button('new对象 转为json').onClick((_)=>{
  hilog.error(0x01,'StateManagerV2Page',`toJSON: ${JSON.stringify(this.person)}`)
})
Button('new对象 getTarget 转为json').onClick((_)=>{
  hilog.error(0x01,'StateManagerV2Page',`toJSON: ${JSON.stringify(UIUtils.getTarget(this.person))}`)
})

当我们一次点击这三个按钮后,控制台输出

toJSON: {“name”:“huangyuan”,“age”:19,“address”:{“zipCode”:“111111”,“city”:“shangdong”}}
toJSON: {“__ob_name”:“xuan”,“__ob_age”:18,“__ob_address”:{“__ob_zipCode”:“000000”,“__ob_city”:“北京”}}
toJSON: {“__ob_name”:“xuan”,“__ob_age”:18,“__ob_address”:{“__ob_zipCode”:“000000”,“__ob_city”:“北京”}}

可以看到,使用new操作符创建的ObservedV2对象属性都添加了__ob_前缀,而通过json 字符串反序列化之后再使用UIUtils.makeObserved方法添加代理之后的对象并没有添加__ob_前缀。

双向绑定

在状态管理 V2 中,更倾向于单向数据流,所有可同步数据的修改都有父控件来处理,然后同步到子组件。 子组件想要修改数据时,需要调用用@Event修饰的回调方法。写起来略显繁琐,这里因此提供了!!双向绑定语法糖。
在使用时,子组件中@Event方法名需要声明为“$”+ @Param属性名,这里还有一些需要注意的地方

如果父组件使用了!!双向绑定语法,则表明父组件的变化会同步给子组件,子组件的变化也会同步给父组件。
如果父组件没有使用!!,则父组件发生的变化是单向的。

@Local count: number = 4
build() {
  Star({count:this.count!!}) //注意这里,在参数的末尾加了双叹号
}

@ComponentV2
struct Star{

  @Param @Require count:number
  @Event $count:(val:number) => void

  build() {
    Column(){
      Text(`value ${this.count}`)
      Button('改变value').onClick((_)=>{
        this.$count(this.count +1)
      })
    }
  }
}

当我们点击Star中的改变value按钮时,组件中count值也会跟着改变。这个双向绑定的语法糖可以粗暴的理解为

Star({ value: this.value, $value: (val: number) => { this.value = val }})

如果是较为复杂的属性变化,还是使用原始的方案,不要使用语法糖了。


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

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

相关文章

Grok 3 vs. DeepSeek vs. ChatGPT:2025终极AI对决

2025 年,AI 领域的竞争愈发激烈,三个重量级选手争夺霸主地位:Grok 3(由 xAI 开发)、DeepSeek(国内 AI 初创公司)和 ChatGPT(OpenAI 产品)。每个模型都有自己独特的优势,无论是在深度思考、速度、编程辅助、创意输出,还是在成本控制方面,都展现出强大的实力。但究竟…

手机大厂如何处理安卓分屏退出后最近任务显示一半问题?

背景: 近来在有学员朋友在群里讨论到了一个分屏退出后,在桌面最近任务中的卡片显示异常问题,虽然他的问题和目前市场上的最近任务显示一半情况不一样。但是这里也刚好启发了群里vip学员们对这个最近任务对分屏task只显示一半画面问题进行相关…

Spring Cloud——路由网关Zuul

??? 哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!??? 【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。 【一心同学】博客…

WorldQuant Brain的专属语言——Fast Expression

使用brain需要的编程语言 在使用BRAIN平台时往往不需要事先有编码背景,因此小白也能很快对其上手,但有经验的程序员来讲,该平台暂时没有禁止API通信低强度进行时的程序化访问(但是非常不好意思😣怎么访问我没找到&…

人大金仓KCA | 对象访问权限入门

人大金仓KCA | 对象访问权限入门 一、知识预备1. 对象的分类2. 对象访问权限概述3. 级联授权4. 权限描述符5. 使用EasyKStudio查看用户权限 二、案例实施1. 用户授权综合案例2. 对象的创建者默认就是对象的所属主3. 该表对象的所属主4. 对象属主的权限设置5. 授权普通用户访问对…

StrokesPlus【电脑鼠标键盘手势软件】v0.5.8.0 中文绿色便携版

前言 StrokesPlus.net是一个超方便的手势识别软件,它能帮你用手势来代替鼠标和键盘操作。用起来既简单又灵活,功能还特别强大。 操作起来非常简单,它有好多实用的功能,比如智能识别你写的字、设定手势操作的区域、模拟鼠标的各种…

springBoot统一响应类型3.1版本

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…

DDD 架构之领域驱动设计【通俗易懂】

文章目录 1. 前言2. MVC 对比 DDD3. DDD 分层架构4. 完整业务流程 1. 前言 官方回答:DDD是一种应对复杂业务系统的设计方法,通过将软件设计与业务领域紧密结合,帮助开发人员构建清晰、可维护的领域模型。在复杂的业务系统中,它能…

LeetCode 889.根据前序和后序遍历构造二叉树

题目: 给定两个整数数组,preorder 和 postorder ,其中 preorder 是一个具有 无重复 值的二叉树的前序遍历,postorder 是同一棵树的后序遍历,重构并返回二叉树。 如果存在多个答案,您可以返回其中 任何 一…

SSM共享充电宝系统

🍅点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 SS…

Android 常用命令和工具解析之存储相关

1 基本概念 2 命令解读 2.1 adb shell df df 命令主要用于需要检查文件系统上已使用和可用的磁盘空间的数量。如果没有指定文件名,则显示在当前所有挂载的文件系统上可用的空间。其原理是从proc/mounts 或 /etc/mtab 中检索磁盘信息。 注意:df命令并…

51单片机编程学习笔记——LED原理图

大纲 概览LED电路图Resistor Pack3位数电阻表示法VCC 在《51单片机编程学习笔记——编译代码点亮LED》一文中,我们通过下面这段代码点亮了D1和D2两个LED灯。 sbit LED1P2^0; //将P2.0管脚定义为LED1 sbit LED2P2^1; //将P2.1管脚定义为LED2 …… LED10; LED20;那么…

测试的BUG分析

在了解BUG之前,我们要先了解软件测试的生命周期,因为大多数BUG都是在软件测试的过程中被发现的 软件测试的生命周期 在了解 软件测试的生命周期 之前,我们要先了解 软件的生命周期 ,虽然他们之间只差了两个字,但是差距还是很大的 首先是 软件生命周期 ,这个是站在 软件 的角…

vue3+ts实现动态下拉选项为图标

功能&#xff1a;实现可配置项&#xff0c;下拉选项为图标&#xff0c;如图&#xff1a; 代码如下&#xff1a; <el-select v-model"BuyVolAcc" size"small" style"width: 100%" class"icon-selector"><el-option v-for&qu…

C语言(15)-------------->一维数组

这篇文章介绍的是数组的定义、创建、初始化、使用&#xff0c;在数组中输入内容并输出数组中的内容&#xff0c;并探讨了数组在内存中的存储。里面有些内容建议大家参考下面的一些文章&#xff0c;有助于加深大家对于C语言的理解&#xff1a; C语言&#xff08;2&#xff09;-…

RISCV指令集解析

参考视频&#xff1a;《RISC-V入门&进阶教程》1-4-RV32I基本指令集&#xff08;1&#xff09;_哔哩哔哩_bilibili privilege是特权指令集&#xff0c;有点系统调用的感觉&#xff0c;要走内核态。unprivilege指令集有点像普通的函数调用。

2.27 链表中等 817

817. Linked List Components class Solution { public:int numComponents(ListNode* head, vector<int>& nums) {// 将 nums 存储到一个 unordered_set 中&#xff0c;方便 O(1) 查找unordered_set<int> numSet(nums.begin(), nums.end());int count 0;bool …

NFC拉起微信小程序申请URL scheme 汇总

NFC拉起微信小程序&#xff0c;需要在微信小程序开发里边申请 URL scheme &#xff0c;审核通过后才可以使用NFC标签碰一碰拉起微信小程序 有不少人被难住了&#xff0c;从微信小程序开发社区汇总了以下信息&#xff0c;供大参考 第一&#xff0c;NFC标签打开小程序 https://de…

rustdesk远程桌面自建服务器

首先&#xff0c;我这里用到的是阿里云服务器 centos7版本&#xff0c;win版客户端。 准备工作 centos7 服务器端文件&#xff1a; https://github.com/rustdesk/rustdesk-server/releases/download/1.1.11-1/rustdesk-server-linux-amd64.zip win版客户端安装包&#xff1…

ERROR “GET /mobiles/13344444444/count/ HTTP/1.1“ 500 63503

背景&#xff1a; 美多的&#xff0c;这个问题我不知道那个老师为啥没讲&#xff0c;我直接去看了他的源码发现可恶&#xff0c;直接啥也没有&#xff0c;关键是他竟然跑的通 早知道用postman代替这个该死的刷新就好了&#xff0c;我写了差不多20多次 view.py的 class Mobile…