HarmonyOS 状态管理(一)

1. HarmonyOS 状态管理

1.1. 说明

  官方文档(https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-state-management-V5)
在这里插入图片描述

1.1.1. 状态管理(V1稳定版)

  状态管理(V1稳定版)提供了多种装饰器,用于在组件级别管理状态 。这些装饰器包括:
  @State:用于声明组件的状态变量,可以作为其子组件的单向和双向同步数据源 。
  @Prop:用于建立组件与父组件的单向数据同步关系 。
  @Link:用于建立组件与父组件的双向数据同步关系 。
  @Observed:用于观察多层嵌套的变化。
  @ObjectLink:用于观察嵌套的数据变化,并与父组件的数据源建立双向同步。
  @Provide和**@Consume**:用于跨组件层级同步状态变量 。
  @Watch:用于监听状态变量的变化 。
  这些装饰器主要用于在组件内部管理状态变量,并通过不同的同步方式(单向、双向)与父组件或其他组件进行数据交换。

1.1.2. 状态管理(V2试用版)

  状态管理(V2试用版)在V1版本的基础上进行了增强,主要特点包括:
(1)深度观察:状态变量独立于UI,更改数据会触发相应视图的更新。
(2)对象深度观测:支持对象的深度观测和深度监听。
(3)属性级更新:支持对象中属性级精准更新及数组中元素的最小化更新 。
(4)装饰器易用性高:装饰器间配合使用更灵活,有利于组件化 。
(5)状态管理(V2试用版)引入了一些新的装饰器,如:
  @ObservedV2:用于装饰class,使得被装饰的class具有深度监听的能力。
  @Trace:用于装饰被@ObservedV2装饰的class中的属性,使得属性具有深度观测的能力 。
  @ComponentV2:用于装饰struct,支持新的装饰器,如@Local、@Param、@Once、@Event、@Monitor、@Provider、@Consumer等 。

1.1.3. 关系总结

  虽然两者不能混合使用,但V2版本在V1版本的基础上进行了扩展和优化,为开发者提供了更强大的状态管理能力。
  状态管理(V1稳定版)和状态管理(V2试用版)在功能上有以下关系:

1.1.3.1. V1版本

(1)状态变量不能独立于UI,需要通过UI组件来同步更新 。
(2)支持多层嵌套的状态变化,但观测性能有限。
(3)提供了多种装饰器用于组件级别的状态管理和双向数据同步 。

1.1.3.2. V2版本

(1)状态变量独立于UI,支持深度观测和深度监听 。
(2)提供了更灵活的装饰器,支持对象级的精准更新和数组元素的最小化更新。
(3)增强了观测性能和装饰器的易用性,更有利于组件化开发。

1.2. 状态管理(V1稳定版)组件间数据共享

1.2.1. 共享方向:父到子

  @Prop 作用:@Prop从父组件接收数据,组件间数据共享。

@Entry
@Component
struct PropPage {//共享方向:父到子, @Prop只能用于子组件获取父组件的数据,无法同步@State num: number = 0build() {Column() {//第一个num为子组件中的变量名,第二个num为父组件中的变量名PropComponent({ num: this.num })Button("父组件+1").onClick(() => {this.num++})}.width("100%")}
}@Component
struct PropComponent {//这里的变量名必须与父组件传值中冒号前的变量名一致@Prop num: numberbuild() {Text("子组件:"+this.num.toString()).margin({top:30,bottom:20})}
}

在这里插入图片描述

1.2.2. 共享方向:双向

  @Provide与@Consume 作用:@Provide作为数据的提供方,可以更新其子孙节点的数据;@Consume接收@Provide的数据

@Entry
@Component
struct ProvidePage {//@Provide配合@Consume可以同步父组件与子孙组件之间的数据,优点是不用传参@Provide count: number = 1build() {Column() {Text("父组件:"+this.count )//调用子组件时不用传递数据ConsumeComponent()}.width('100%').alignItems(HorizontalAlign.Center).padding(30)}
}//子组件
@Component
struct ConsumeComponent {//变量名要跟@Provide一样@Consume count: numberbuild() {Column() {Text("子组件"+this.count.toString())//点击+1Text("子组件点击+1").onClick(() => {this.count++})}}
}

在这里插入图片描述

1.2.3. 共享方向:双向

  @Provide与@Consume 作用:@Provide作为数据的提供方,可以更新其子孙节点的数据;@Consume接收@Provide的数据

@Entry
@Component
struct LinkPage {//@Link 作用:将数据与父组件的数据共享// 共享方向:双向@State count: number = 1build() {Column() {Text("父组件中的count:" + this.count.toString())//第一个count为在子组件中的变量名,第二个count为在父组件中的变量名LinkComponent({ count: $count })}.width("100%")}
}
//子组件
@Component
struct LinkComponent {//变量名要跟父组件传值中冒号前的变量名一致@Link count: numberbuild() {Column() {Text("子组件中的count:" +this.count.toString())//点击+1Text("子组件点击+1").onClick(() => {this.count++})}}
}

在这里插入图片描述

1.2.4. 共享方向:双向

  @Provide与@Consume 作用:@Provide作为数据的提供方,可以更新其子孙节点的数据;@Consume接收@Provide的数据

//@Observe用于类、对象、数组的声明
@Observed
class stu {public id: stringname: stringconstructor(id: string, name: string) {this.id = idthis.name = name}
}@Entry
@Component
struct ObjectLinkPage {//@ObjectLink与@Observe// 作用:类、对象、数组类型数据的数据共享// 共享方向:双向@State me: stu = new stu("001", "张三")build() {Column() {Text("学号:" + this.me.id)Text("姓名:" +this.me.name)//第一个me为子组件中的变量名,第二个me为父组件中的变量名ObjectLinkComponent({ me: this.me })}.padding(20)}
}@Component
struct ObjectLinkComponent {//变量名要与父组件传值中冒号前的变量名一致@ObjectLink me: stubuild() {TextInput({ placeholder: "请输入学号" }).onChange((value) => {this.me.id = value})}
}

在这里插入图片描述

1.2.5. 总结

  @Prop只能用于子组件获取父组件的数据,无法同步
  @Link可以同步父子组件的数据
  @Provide配合@Consume可以同步父组件与子孙组件之间的数据,优点是不用传参,代码简单
  @ObjectLink配合@Observe可以同步父子组件的类、对象、数组类型的数据

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

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

相关文章

【iOS】——SideTable

SideTable Side Table主要用于存储和管理对象的额外信息,特别是与弱引用相关的数据。Side Table的设计和使用是Objective-C运行时实现弱引用的基础,使得ARC(Automatic Reference Counting)能够正确地处理弱引用的生命周期。 新版…

【系统架构设计 每日一问】四 如何对关系型数据库及NoSql数据库选型

根据不同的业务需求和场景,选择适合的数据库类型至关重要。以下是一个优化后的表格展示,涵盖了管理型系统、大流量系统、日志型系统、搜索型系统、事务型系统、离线计算和实时计算七大类业务系统的数据库选型建议。先明确下NoSQL的分类 NoSQL数据库分类…

大数据学习之sparkstreaming

SparkStreaming idea中初步实现 Spark core: SparkContext 核心数据结构:RDD Spark sql: SparkSession 核心数据结构:DataFrame Spark streaming: StreamingContext 核心数据结构:DStream(底层封装了RDD),遍历出其中的RDD即可进行…

ReadAgent,一款具有要点记忆的人工智能阅读代理

人工智能咨询培训老师叶梓 转载标明出处 现有的大模型(LLMs)在处理长文本时受限于固定的最大上下文长度,并且当输入文本越来越长时,性能往往会下降,即使在没有超出明确上下文窗口的情况下,LLMs 的性能也会随…

中文之美:荷·雅称

文章目录 引言I 荷雅称水宫仙子、六月花神水芝、水芸溪客、水旦芙蕖、菡萏朱华、红蕖风荷、静客II 与荷、莲相关的句子、诗词周敦颐李商隐李重元杨公远孟浩然刘光祖苏轼汪曾祺席慕蓉余光中引言 中文之美,美在诗词歌赋,美在绝句华章,也美在对事物名称的雅致表达。 中文对万物…

GPT-4o mini是什么?

今天,全网都知道 OpenAI 发现货了! GPT-4o mini 取代 GPT 3.5,从此坐上正主之位。 从官网信息来看,OpenAI 最新推出的 GPT-4o mini 重新定义了 AI 成本效益的标准,其性能优于前代模型 GPT-3.5 Turbo,且成本…

ruoyi-cloud-plus

1.X项目初始化 (dromara.org)参考文档! 可以直接参考以上链接!我只是整理我自己需要的部分,方便查看使用。 nacos 服务启动顺序 必须启动基础建设: mysql redis nacos可选启动基础建设: minio(影响文件上传) seata(影响分布式事务 默认开启…

Synopsys:Design Compiler的XG模式和DB模式

相关阅读 Synopsyshttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 很久之前,Design Compiler使用的是DB模式(包括一些其他工具,例如DFT Compiler, Physical Compiler和Power Compiler)&…

二叉树基础及实现(一)

目录: 一. 树的基本概念 二. 二叉树概念及特性 三. 二叉树的基本操作 一. 树的基本概念: 1 概念 : 树是一种非线性的数据结构,它是由n(n>0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因…

数据结构之初始二叉树(4)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 二叉树的基本操作 二叉树的相关刷题(上)通过上篇文章的学习,我们…

queue的模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾什么是适配器模式?准备工作包含头文件定义命名空间类的成员变量 默认成员函数emptysizefrontbackpushpop全部代码 全部的实现代码放在了文章末尾 queue的模拟实现和stack一样,采用了C适配器模式 queue的适配器一…

Java生成四位纯数字并且确保唯一性

背景: 给了我一个需求,由于某些问题原因,需要给属性和数据添加一个code字段,这是给我发的消息 这两个要求其实是同一个需求,就是在创建对象的时候塞入一个unique的code嘛,听起来很简单吧,但是实…

GooglePlay 金融品类政策更新(7月17号)

距离上次政策大更新(4月5号)才过去了3个月,Google Play又迎来了一次大更新,不得不说Google Play的要求越来越高了。 我们来梳理一下这次GooglePlay针对金融品类更新了哪些政策: 1.要求提供金融产品和服务的开发者必须注册为组织…

Window环境下MySQL管理

1、MySQL服务启用和停止 图形化界面管理 使用键盘组合键(Win R)打开运行对话框,在对话框中输入services.msc并点击确定。 这里可以看到服务名称为MySQL84并处于正在运行的状态。 选中后右键可以进行暂停、停止、重启等操作。 命令提示符管理…

OpenCV 直方图概念,直方图均衡化原理详解

文章目录 直方图相关概念颜色灰度级作用应用场景 C 使用OpenCV绘制直方图单通道直方图关键代码分析:calcHist函数分析使用OpenCV API来绘制直方图 效果图: 彩色三通道直方图效果图: 直方图均衡化概念均衡化作用均衡化效果均衡化数学原理步骤数…

Linux中进程间通信--匿名管道和命名管道

本篇将会进入 Linux 进程中进程间通信,本篇简要的介绍了 Linux 中进程为什么需要通信,进程间通信的常用方式。然后详细的介绍了 Linux 进程间的管道通信方式,管道通信分为匿名管道和命名管道,本篇分别介绍了其实现的原理&#xff…

基于VMware(虚拟机) 创建 Ubunton24.04

目录 1.设置 root 密码 2. 防火墙设置 2.1 安装防火墙 2.2 开启和关闭防火墙 2.3 开放端口和服务规则 2.4 关闭端口和删除服务规则 2.5 查看防火墙状态 3. 换源 3.1 源文件位置 3.2 更新软件包 1. 设置网络 1. 在安装ubuntu时设置网络 2.在配置文件中修改 2.设置 r…

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain,表示协议族,只能为AF_LOCAL或者AF_UNIX; 第2个参数type,表示类型,只能为0。 第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…

HTTP 缓存

缓存 web缓存是可以自动保存常见的文档副本的HTTP设备,当web请求抵达缓存时,如果本地有已经缓存的副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。使用缓存有如下的优先。 缓存减少了冗余的数据传输缓存环节了网络瓶颈的问题…

MySQL学习之InnoDB引擎,索引

Mysql中的引擎 我们先来看一下MySql提供的有哪些引擎 mysql> show engines; 从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。 查看MySQL当前默认的存储引…