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数据库分类…

预训练语言模型实践笔记

Roberta output_hidden_statesTrue和last_hidden_states和pooler_output 在使用像BERT或RoBERTa这样的transformer模型时,output_hidden_states和last_hidden_state是两个不同的概念。 output_hidden_states: 这是一个布尔值,决定了模型是否应该返回所…

大数据学习之sparkstreaming

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

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

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

中文之美:荷·雅称

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

Speaker Tracking SOTA 文章翻译

AV-A-PF Abstract 在室内环境中跟踪多个移动说话者的问题受到了广泛关注。早期的技术完全基于单一模态,例如视觉。最近,多模态信息的融合已被证明在提高跟踪性能以及在像遮挡这样的具有挑战性情况下的鲁棒性方面发挥了重要作用(由于摄像机视…

寄存器与CPU和硬盘的关系

寄存器与 CPU 之间的信息传递主要通过数据总线、地址总线和控制总线来实现: 1. 数据总线(Data Bus):用于在 CPU 和寄存器之间传输数据。当 CPU 需要从寄存器中读取数据时,数据通过数据总线从寄存器传输到 CPU&#xff…

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(影响分布式事务 默认开启…

弹性伸缩:如何在Eureka中实现服务的自动扩展和收缩

弹性伸缩:如何在Eureka中实现服务的自动扩展和收缩 在微服务架构中,服务的自动扩展和收缩是实现高可用性和成本效益的关键策略。Eureka,作为Netflix开源的服务发现框架,虽然本身不直接提供自动扩展和收缩的功能,但我们…

[2024-7-22]面试题2

Redis的持久化机制,在真实的线上环境中需要采取什么样的策略 在真实的线上环境中,Redis的持久化机制主要有两种:RDB(Redis DataBase)和AOF(Append Only File)。每种机制都有其优点和适用场景,实…

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的适配器一…

Leetcode 3229. Minimum Operations to Make Array Equal to Target

Leetcode 3229. Minimum Operations to Make Array Equal to Target 1. 解题思路2. 代码实现 题目链接:3229. Minimum Operations to Make Array Equal to Target 1. 解题思路 这一题其实也还蛮简单的,我们只需要考察一下两个数组的差值序列即可。 我…

PCI总线域与处理器域

PCI总线域 在x86处理器系统中,PCI总线域是外部设备域的重要组成部分。实际上在Intel的x86处理器系统中,所有的外部设备都使用PCI总线管理。而AMD的x86处理器系统中还存在一条HT(HyperTransport)总线,在AMD的x86处理器系统中还存在HT总线域。…

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

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

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

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