【鸿蒙系统学习笔记】状态管理

一、介绍

资料来自官网:文档中心

在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染,在ArkUI中统称为状态管理机制。

  • View(UI):UI渲染,指将build方法内的UI描述和@Builder装饰的方法内的UI描述映射到界面。
  • State:状态,指驱动UI更新的数据。用户通过触发组件的事件方法,改变状态数据。状态数据的改变,引起UI的重新渲染。

 

说明:

@State装饰器标记的变量必须初始化,不能为空值

@State支持Object、class、string、number、boolean、enum类型以及这些类型的数组

嵌套类型以及数组中的对象属性无法触发视图更新 

二、父子组件数据同步

2.1、@Prop装饰器:父子单向同步

@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的变量是可变的,但是变化不会同步回其父组件。

@Entry
@Component
struct StatePage {@State name: string = '汤姆'build() {Row() {Column({space:8}) {Text(this.name).StatePage_textSty()// 父组件的数据源的修改会同步给子组件Button('点我').StatePage_btnSty(() =>  this.name = this.name === '汤姆' ? '杰克' : '汤姆')Divider()PropPage({contentProp:this.name})}.width('100%')}.height('100%')}
}//存放一个@Prop装饰的状态数据,方便父子组件数据传递  State ---> Prop
@Component
struct PropPage {@Prop contentProp:stringbuild() {Column({space:8}){Text('prop--' + this.contentProp).StatePage_textSty()// @Prop装饰的变量不会同步给父组件Button('修改prop的值').StatePage_btnSty(() => this.contentProp = '杰克逊')}}
}//text和button重复的样式进行复用
@Extend(Text) function StatePage_textSty(){.fontSize(30).fontWeight(FontWeight.Bold).fontColor(Color.Green)
}@Extend(Button) function StatePage_btnSty(click:Function){.fontSize(30).onClick(() => click())
}

上面示例中:

父组件StatePage,子组件PropPage

①当点击父组件的按钮时,父组件的name发生变化,子组件的contentProp 也发生了变化

②当点击子组件的按钮时,子组件的contentProp 发生变化,但父组件的name未改变

✍使用@Prop,父子单向同步

2.2、@Link装饰器:父子双向同步 

@Link装饰的变量与其父组件中的数据源共享相同的值。

限制条件:@Link装饰器不能在@Entry装饰的自定义组件中使用

上面示例中:

父组件StatePage,子组件LinkPage

①当点击父组件的按钮时,父组件的name发生变化,子组件的contentLink也发生了变化

②当点击子组件的按钮时,子组件的contentLink发生变化,父组件的name也发生了变化

✍使用@Link,父子双向同步

三、后代组件双向同步

3.1、@Provide装饰器和@Consume装饰器:与后代组件双向同步

@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。

下面代码具有相同的变量名,使用@Provide和@Consume实现与后代组件数据同步👇

@Entry
@Component
struct ProvideConsume {@Provide name: string = '关羽'build() {Row() {Column({space:20}) {Text(this.name).ProvideConsume_textStyle().onClick(() => this.name = '张飞')Divider()ProvideConsume_son()}.width('100%')}.height('100%')}
}@Component
struct ProvideConsume_son {build() {Column({space:20}){Text('子组件:').ProvideConsume_textStyle()Divider()ProvideConsume_sun()}}
}@Component
struct ProvideConsume_sun{@Consume name:stringbuild() {Column(){Text('孙组件:'+ this.name).ProvideConsume_textStyle().onClick(() => {this.name = '刘备'})}}
}@Extend(Text) function ProvideConsume_textStyle(){.fontSize(30).fontWeight(FontWeight.Bold).fontColor(Color.Green)
}

下面代码变量名不一致,但具备相同的别名,使用@Provide和@Consume实现与后代组件数据同步👇

 

上面示例中:

父组件ProvideConsume,子组件ProvideConsume_son,孙组件ProvideConsume_sun

①点击父组件的按钮,父组件的name发生变化,孙组件的name也发生变化

②点击孙组件的按钮,孙组件与父组件的name同时发生变化


✍父组件使用@Provide将name变量给孙组件,孙组件通过使用@Consume去获取@Provide提供的变量,建立在@Provide和@Consume之间的双向数据同步

✍@Provide和@Consume可以通过相同的变量名或者相同的变量别名绑定,变量类型必须相同。

 

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

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

相关文章

【工作记录】基于docker+mysql部署单机版nacos2.0.4@20240219

Nacos介绍 Nacos 是阿里巴巴开源的一款集服务发现、配置管理和服务元数据管理于一身的中间件,主要用于构建云原生应用和微服务架构。Nacos 提供了一站式的解决方案,使得开发者能够更容易地实现服务治理和服务间的协作。 以下是 Nacos 主要功能特点&…

[AudioRecorder]iPhone苹果通话录音汉化破解版-使用巨魔安装-ios17绕道目前还不支持

首先你必须有巨魔才能使用!! 不会安装的,还没安装的移步这里,ios17 以上目前装不了,别看了:永久签名 | 网址分类目录 | 路灯iOS导航-苹果签名实用知识网址导航-各种iOS技巧-后厂村路灯 视频教程 【Audio…

头歌:共享单车之数据分析

第1关 统计共享单车每天的平均使用时间 package com.educoder.bigData.sharedbicycle;import java.io.IOException; import java.text.ParseException; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java…

科技云报道:云原生是大模型“降本增效”的解药吗?

科技云报道原创。 在过去一两年里,以GPT和Diffusion model为代表的大语言模型和生成式AI,将人们对AI的期待推向了一个新高峰,并吸引了千行百业尝试在业务中利用大模型。 国内各家大厂在大模型领域展开了激烈的军备竞赛,如&#…

HTTP 头部- Origin Referer

Origin & Referer Origin Header 示例 Origin 请求头部是一个 HTTP 头部,它提供了发起请求的网页的源(协议、域名和端口)信息。它通常在进行跨域资源共享(CORS)请求时使用,以便服务器可以决定是否接受…

Python set函数

在Python编程中,set()函数是一个重要且常用的内置函数,用于创建一个新的集合对象。集合是一种无序且不重复的数据类型,它可以用于存储唯一的元素。本文将深入探讨Python中的set()函数,包括基本用法、集合操作、实际应用场景&#…

PyCharm - Project Interpreter (项目解释器)

PyCharm - Project Interpreter [项目解释器] References File -> Settings… -> Project: -> Project Interpreter References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Vue过滤器原理

Vue过滤器 什么是Vue过滤器定义Vue过滤器 组件的选项中定义本地的过滤器或者在创建 Vue 实例之前全局定义过滤器单个器原理串联过滤器过滤器参数接收 _f函数的原理 过滤器解析原理 总结: vue 过滤器原理 Vue过滤器 过滤器实质不改变原始数据,只是对数据…

基于数字双输入的超宽带Doherty功率放大器设计-从理论到ADS版图

基于数字双输入的超宽带Doherty功率放大器设计-从理论到ADS版图 参考论文: 高效连续型射频功率放大器研究 假期就要倒计时啦,估计是寒假假期的最后一个博客,希望各位龙年工作顺利,学业有成。 全部工程下载:基于数字双输入的超宽…

遇到问题(二) 中文乱码

例如这样: 原本是这样: 解决方法:点击扳手工具设置——Editor——Encoding——选chinese GB2312(有的是UTF-8)

LabVIEW高速信号测量与存储

LabVIEW高速信号测量与存储 介绍了LabVIEW开发的高速信号测量与存储系统,解决实验研究中信号捕获的速度和准确性问题。通过高效的数据处理和存储解决方案,本系统为用户提供了一种快速、可靠的信号测量方法。 项目背景 在科学研究和工业应用中&#xf…

数学能够及不能够有效表征人类智能中的部分

一、数学能够有效表征人类智能中的以下部分: 1、部分逻辑推理能力:数学涉及到推理、证明和解决问题的过程,这需要运用逻辑思维和推理能力。通过学习数学,人们能够培养自己的部分逻辑思维和推理能力,从而提高某些问题解…

Ubuntu18.04有线连接后,无法设置ip地址以及显示网口设置

前提:首先测试过网线是完全没问题的 桌面端找不到设置网口 终端输入: ifconfig 没有找到网口设置和对应IP 然后查询网口驱动是否正常安装,输入: lspci | grep Ethernet 有输出说明网口驱动正常安装 然后查询电脑的ip地址&am…

物流EDI:Verizon EDI 需求分析

作为物流行业的企业,Verizon与其供应商之间通过EDI来传输业务单据。在与Verizon建立EDI连接时,需要参考EDI 指南、采购订单条款和条件以及运输路线指南这三个文档。 点击此链接,获取上述的三个文档 Verizon供应商可以通过上述链接找到用于处…

2024-2-19

编译安装php下载依赖包时遇到的报错 [rootmasternamed ~]# yum -y install php-mcrypt \ > libmcrypt \ > libmcrypt-devel \ > autoconf \ > freetype \ > gd \ > libmcrypt \ > libpng \ > libpng-devel \ > libjpeg \ > libxml2 \…

ubuntu22.04@laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module

ubuntu22.04laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 使用 OpenCV DNN 模块进行图像分类3.1 导入模块并加载类名文本文件3.2 从磁盘加载预训练 DenseNet121 模型3.3 读取图像并准备为模型输…

Python 实现Excel 文件合并

Excel 文件合并方法较多,前面文章有通过Uipath RPA 对文件进行合并,也可以通过Python或VBA写脚本合并。 通常写脚本维护性更加简洁,本文提供Python 脚本对Excel 文件进行合并,参考Uipath 调用Python 文章,Uipath 调用Python 脚本程序详解-CSDN博客 便能快速实现。代码如…

解决npm淘宝镜像到期问题

1 背景 由于node安装插件是从国外服务器下载,如果没有“特殊手法”,就可能会遇到下载速度慢、或其它异常问题。 所以如果npm的服务器在中国就好了,于是我们乐于分享的淘宝团队干了这事。你可以用此只读的淘宝服务代替官方版本,且…

ARM体系在linux中的中断抢占

上一篇说到系统调用等异常通过向量el1_sync做处理,中断通过向量el1_irq做处理,然后gic的工作都是为中断处理服务,在rtos中,我们一般都会有中断嵌套和优先级反转的概念,但是在linux中,中断是否会被其他中断抢…

kali入门

文章目录 第一部分:安装Kali Linux步骤一:下载Kali Linux镜像文件步骤二:安装VMware Workstation Pro步骤三:安装Kali Linux 第二部分:Kali Linux简介第三部分:关于作者第四部分:DDoS攻击实例代…