鸿蒙状态管理概述 v2

状态管理v2

  • 概述
  • 状态管理之v2
    • @ObservedV2 和 @Trace
      • 状态管理V1版本对嵌套类对象属性变化直接观测的局限性
      • ObservedV2 和 Trace 使用场景
    • @Local
      • 状态管理V1版本@State装饰器的局限性
    • @Param
      • 状态管理V1版本接受外部传入的装饰器的局限性
    • @Once
    • @Event
    • @Computed
      • Computed 使用场景
    • @Type
    • PersistenceV2
    • AppStorageV2
    • !!语法
    • Repeat
    • getTarget
    • makeObserved

概述

为了增强状态管理框架对类对象中属性的观测能力,开发者可以使用@ObservedV2装饰器和@Trace装饰器装饰类以及类中的属性。

@Trace装饰器与现有状态管理框架的@Track与@State装饰器的能力不同,@Track使class具有属性级更新的能力,但并不具备深度观测的能力;而@State只能观测到对象本身以及第一层的变化,对于多层嵌套场景只能通过封装自定义组件,搭配@Observed和@ObjectLink来实现观测。

状态管理之v2

  • @ObservedV2 和 @Trace:类属性变化观测
  • @ComponentV2:自定义组件,对应v1的@Component
  • @Local:组件内部状态,对应v1的@State
  • @Param:组件外部输入
  • @Once:初始化同步一次
  • @Event:组件输出
  • @Monitor:状态变量修改监听,对应v1的@Watch
  • @Provider 和 @Consumer:跨组件层级双向同步,对应v1的@Provide和@Consume
  • @Computed:计算属性
  • @Type:标记类属性的类型
  • AppStorageV2:应用全局UI状态存储,对应v1的AppStorage
  • PersistenceV2:持久化储存UI状态,对应v1的PersistentStorage
  • !!语法:双向绑定,
  • Repeat:子组件复用
  • getTarget接口:获取状态管理框架代理前的原始对象
  • makeObserved接口:将非观察数据变为可观察数据

@ObservedV2 和 @Trace

@ObservedV2和@Trace提供了对嵌套类对象属性变化直接观测的能力,是状态管理V2中相对核心的能力之一。

状态管理V1版本对嵌套类对象属性变化直接观测的局限性

@Track使class具有属性级更新的能力,但并不具备深度观测的能力;而@State只能观测到对象本身以及第一层的变化,对于多层嵌套场景只能通过封装自定义组件,搭配@Observed和@ObjectLink来实现观测。

ObservedV2 和 Trace 使用场景

嵌套类或继承类中使用,用于装饰类以及类中的属性,使得被装饰的类和属性具有深度观测的能力

@Local

  • 被@Local装饰的变量无法从外部初始化,因此必须在组件内部进行初始化。
  • 当被@Local装饰的变量变化时,会刷新使用该变量的组件。
  • @Local的观测能力仅限于被装饰的变量本身。

状态管理V1版本@State装饰器的局限性

在V1中,由于@State装饰器能够从外部初始化,因此@State无法准确表达组件内部状态不能被外面修改的语义。

@Param

  • @Param不仅可以接受组件外部输入,还可以接受@Local的同步变化。
  • 允许本地初始化,若不在本地初始化,则需要和@Require装饰器一起使用,要求必须从外部传入初始化。
  • @Param装饰的变量在子组件中无法进行修改。但当装饰的变量类型为对象时,在子组件中修改对象中属性是允许的。

状态管理V1版本接受外部传入的装饰器的局限性

  • 状态管理V1存在多种可接受外部传入的装饰器,常用的有@State、@Prop、@Link、@ObjectLink。
  • @Prop虽然能够进行单向同步,但是对于较复杂的类型来说,深拷贝性能较差。
  • @Link能够接受传入的引用进行双向同步,但它必须要求数据源也是状态变量,因此无法接受info中的成员属性region。
  • @ObjectLink能够接受类成员属性,但是要求该属性类型必须为@Observed装饰的类。装饰器的不同限制使得父子组件之间传值规则十分复杂,不易使用。

@Once

  • @Once必须搭配@Param使用,单独使用或搭配其他装饰器使用都是不允许的。
  • @Once不影响@Param的观测能力,仅针对数据源的变化做拦截。
  • @Once与@Param搭配使用时,可以在本地修改@Param变量的值。

@Event

  • 由于@Param装饰的变量在本地无法更改,使用@Event装饰器装饰回调方法并调用,可以实现更改数据源的变量,再通过@Local的同步机制,将修改同步回@Param,以此达到主动更新@Param装饰变量的效果。
  • @Param标志着组件的输入,表明该变量受父组件影响,而@Event标志着组件的输出,可以通过该方法影响父组件。使用@Event装饰回调方法是一种规范,表明该回调作为自定义组件的输出。父组件需要判断是否提供对应方法用于子组件更改@Param变量的数据源。

@Computed

  • 计算属性,在被计算的值变化的时候,只会计算一次。主要应用于解决UI多次重用该属性从而重复计算导致的性能问题。
  • @Computed为方法装饰器,装饰getter方法。

Computed 使用场景

  • 当被计算的属性变化时,@Computed装饰的getter访问器只会被求解一次(但有性能开销)
  • @Computed装饰的属性可以被@Monitor监听变化
  • @Computed装饰的属性可以初始化@Param

@Type

标记类属性,配合PersistenceV2使用,防止序列化时类丢失。

PersistenceV2

  • 对于与PersistenceV2关联的@ObservedV2对象,该对象的@Trace属性的变化,会触发整个关联对象的自动持久化;
  • PersistenceV2可以和UI组件同步,且可以在应用业务逻辑中被访问。
  • PersistenceV2支持应用的主线程内多个UIAbility实例间的状态共享。
  • 开发者可以通过connect绑定同一个key,在状态变量变换和应用冷启动时,实现持久化能力。

AppStorageV2

  • AppStorageV2可以和UI组件同步,且可以在应用业务逻辑中被访问。
  • AppStorageV2支持应用的主线程内多个UIAbility实例间的状态共享。
  • AppStorageV2是提供状态变量在应用级全局共享的能力,开发者可以通过connect绑定同一个key,进行跨ability的数据共享。

!!语法

  • !!双向绑定语法,是一个语法糖方便开发者实现数据双向绑定,
  • 用于初始化子组件的@Param和@Event。其中@Event方法名需要声明为“$”+ @Param属性名

示例:

@Entry
@ComponentV2
struct Index {@Local value: number = 0;build() {Column() {Text(`${this.value}`)Button(`change value`).onClick(() => {this.value++;})Star({ value: this.value!! })}}
}@ComponentV2
struct Star {@Param value: number = 0;@Event $value: (val: number) => void = (val: number) => {};build() {Column() {Text(`${this.value}`)Button(`change value `).onClick(() => {this.$value(10);})}}
}

Repeat

  • on-virtualScroll场景中,需要与容器组件配合使用,例如,ListItem组件要求Repeat的父容器组件必须为List组件。
  • 与ForEach相比,一是:优化了渲染性能,二是:index由框架侧来维护。
  • virtualScroll场景中,新增了 按需创建组件缓存组件

getTarget

  • 使用getTarget接口需要导入UIUtils工具。
  • 状态管理V2中,会给使用状态变量装饰器如@Trace、@Local装饰的Date、Map、Set、Array添加一层代理用于观测API调用产生的变化。
  • 使用getTarget接口可以获取这些代理对象的原始对象

makeObserved

  • class的定义在三方包中:开发者无法手动对class中需要观察的属性加上@Trace标签,可以使用makeObserved使得当前对象可以被观察。
  • 当前类的成员属性不能被修改:因为@Trace观察类属性会动态修改类的属性,这个行为在@Sendable装饰的class中是不被允许的,此时可以使用makeObserved。
  • interface或者JSON.parse返回的匿名对象:这类场景往往没有明确的class声明,开发者无法使用@Trace标记当前属性可以被观察,此时可以使用makeObserved。

参考资料:状态管理(V2)

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

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

相关文章

Git中revert和reset区别?

git revert 和 git reset 都用于撤销 Git 中的提交,但它们的作用和使用场景不同: git revert: 作用:创建一个新的提交,撤销指定的提交内容。使用场景:用于“回滚”已推送到远程仓库的提交。这种方法不会改变提交历史&a…

LabVIEW开发中的电机控制与相机像素差

在电机控制系统中,我们需要精确控制电机运动与相机拍摄画面之间的关系。理想情况下,当电机带动相机移动同样的距离时,相机拍摄画面中两点之间的像素差应当是一个固定值。然而,在实际应用中,我们发现这一像素差并非固定…

从零到一:构建现代 React 应用的完整指南

1. create-react-app (CRA) 简介: create-react-app 是官方推荐的 React 项目脚手架工具,提供了一个开箱即用的开发环境,帮助开发者快速启动 React 应用。它会自动配置 Webpack、Babel、ESLint 等工具,让你专注于开发而不需要手动配置工具链。 特点: 零配置:CRA 自动配…

rman 备份恢复1

前提: rman用户必须具有sysdba权限 使用常用连接方式如下: rman target / rman target sys/oracle rman target sys/oracleprod1 catalog dav/oracledav_db 一个rman连接会产生两个进程,action字段为空的就是rman的监控进程,另…

Qt程序退出相关资源释放问题

目录 问题背景: aboutToQuit 代码举例 closeEvent事件 代码举例 程序退出方式 quit() exit(int returnCode 0) close() 问题背景: 实际项目中程序退出前往往需要及进行一些资源释放、配置保存、线程中断等操作,避免资源浪费&#xff…

【DeepSeek】Mac m1电脑部署DeepSeek

一、电脑配置 个人电脑配置 二、安装ollama 简介:Ollama 是一个强大的开源框架,是一个为本地运行大型语言模型而设计的工具,它帮助用户快速在本地运行大模型,通过简单的安装指令,可以让用户执行一条命令就在本地运…

[生活杂项][运动教程]自由泳

https://v.youku.com/v_show/id_XMzgzMjkwMzg0MA.html?spma2h0k.11417342.soresults.dtitle https://v.youku.com/v_show/id_XMzgxNjM2NjY4NA.html?spma2h0k.11417342.soresults.dtitle

Linux的指令与热键

一.指令 1.pwd :显示一个用户当前所处的目录 2.ls :显示当前目录下的文件(显示当前文件属性) ls -l :显示当前目录下文件的属性及更多内容(ll是ls -l的别名,用法相同) ls -l 目录:显示指定目录内容 ls…

【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知识整合

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

【OS安装与使用】part5-ubuntu22.04基于conda安装pytorch+tensorflow

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 明确pytorch安装依赖2.2.2 conda创建虚拟环境2.2.3 安装pytorch2.2.4 验证pytorch安装2.2.5 安装Tensorflow2.2.6 验证Tensorflow安装 三、疑问四、总结 一、待解决问题 1.1 问题…

马拉车算法

Manacher算法 ,用于处理最长回文字符串的问题,可以在O(n)的情况下,求出一个字符串的最长回文字符串 回文串的基础解法: 以每个点为中心对称点,看左右两边的点是否相同。这种算法的时间复杂度为O&#xff0…

气象学中的CDO插值(多方法+多分辨率)

文章目录 说明CDO代码 说明 需要新建.sh脚本文件,将下面的CDO代码复制到.sh脚本中,然后运行插值程序。 CDO代码 #!/bin/bash # # 用户配置区(按实际需求修改) # input_directory"2m_temperature" # 自定义路径 gr…

计算机网络:应用层 —— 动态主机配置协议 DHCP

文章目录 什么是 DHCP?DHCP 的产生背景DHCP 的工作过程工作流程地址分配机制 DHCP 中继代理总结 什么是 DHCP? 动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)是一种网络管理协议,用于自动分…

【OS安装与使用】part3-ubuntu安装Nvidia显卡驱动+CUDA 12.4

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 更改镜像源2.2.2 安装NVIDIA显卡驱动:nvidia-550(1)查询显卡ID(2)PCI ID Repository查询显卡型号(3&#xf…

数据导入AI训练步骤——人工智能训练

一、人工操作转化 数据导入过程 整理excel表格,通过数据库管理工具导入数据,补充数据格式,调整sql语句 复制数据到目标数据 二、整理表格 三、导入数据 通过数据库导入数据 四、合并 五、验证更新数据 六、 更新数据 update temp_cus_hmz…

我国首条大型无人机城际低空物流航线成功首航

首航震撼开场:羊肉 “飞” 越 540 公里 在夜色的笼罩下,榆阳马合通用机场的跑道上,一架大型固定翼无人机蓄势待发,机身被灯光照亮,宛如一只即将展翅翱翔的钢铁巨鸟。它的货舱里,满满装载着新鲜的榆林羊肉&a…

《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战

前一篇文章,使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一:AlexNet【下】【论文精读】】的心得。 《跟李沐…

微软Win11新动态:官方“换机助手”曝光,PC数据迁移或迎全新体验

目录 微软入局数据迁移领域,第三方工具或面临挑战 无缝迁移体验:近距离传输与OTP验证 模拟图仅为概念设计,最终功能或存变数 发布时间未定,Insider用户或率先体验 总结 微软在近期发布了Windows 11 Insider Beta频道的最新版本Build 22635.4945。尽管此次更新并未引入重…

Could not initialize class io.netty.util.internal.Platfor...

异常信息: Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…

java练习(34)

ps:题目来自力扣 寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 class Solution {public double findMedianSortedA…