HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器

状态管理

看下面这张图

请添加图片描述

Components部分的装饰器为组件级别的状态管理,Application部分为应用的状态管理。开发者可以通过@StorageLink/@LocalStorageLink 实现应用和组件状态的双向同步,通过@StorageProp/@LocalStorageProp 实现应用和组件状态的单向同步。

@Prop

static Prop(propName: string): any

与 AppStorage 中对应的 propName 建立单向属性绑定。如果给定的 propName 在 AppStorage 中存在,则返回与 AppStorage 中 propName 对应属性的单向绑定数据。如果 AppStorage 中不存在 propName,则返回 undefined。单向绑定数据的修改不会被同步回 AppStorage 中。
prop 是单向绑定,但父级不会跟子集进行相应

@Prop 是单向传递。

@Entry
@Component
struct Index {// State必须要进行初始化@State message: string ='Southern Wind'build() {Row() {Column() {Text(this.message).textStyle()Button('点击').backgroundColor(Color.Black).onClick(()=>{this.message= this.message  === 'Southern Wind'? '你好' : 'Southern Wind';})StateProp({content:this.message})}.width('100%')}}
}// 子组件
@Component
struct StateProp{@Prop content:stringbuild(){Column(){Text('prop:'+this.content).textStyle().fontColor(Color.Green)Button('修改数据').btnStyle(()=>{this.content = 'HarmonyOS4.0'})}}
}
// 文本公共样式
@Extend(Text) function textStyle() {.fontSize(30).fontWeight(FontWeight.Bold)
}
// 按钮公共样式
@Extend(Button) function btnStyle(click:Function) {.backgroundColor(Color.Green).fontSize(25).margin(10).onClick(()=>{click()})}

效果:
请添加图片描述

关于多个页面使用相同组件重名报错问题:
可以自己定义一个规范:
我这里用结构体名称加下划线的形式命名函数,如果文件名为 Index,那么我的按钮组件可以用Index_btnStyle

@Link

static Link(propName: string): any

与 AppStorage 中对应的 propName 建立双向数据绑定。如果给定的 propName 在 AppStorage 中存在,返回与 AppStorage 中 propName 对应属性的双向绑定数据。

双向绑定数据的修改会同步回 AppStorage 中,AppStorage 会将变化同步到所有绑定该 propName 的数据和自定义组件中。

如果 AppStorage 中不存在 propName,则返回 undefined。

以上是官方的说明,其实说白了Prop就是单项数据绑定,Link是双向数据绑定。

@Link 和@Prop 的区别

继续往下看个例子就明白了:

@Entry
@Component
struct Index {// State必须要进行初始化@State message: string = 'Southern Wind'build() {Row() {Column() {Text(this.message).textStyle()Button('点击').backgroundColor(Color.Black).onClick(() => {this.message = this.message === 'Southern Wind' ? '你好' : 'Southern Wind';})StateProp({ content: this.message })// Index_link({content_link:this.message})// 如果是Link,则使用$+变量名进行传递Index_link({content_link: $message})}.width('100%')}}
}// 子组件
@Component
struct StateProp {@Prop content: stringbuild() {Column() {Text('prop:' + this.content).textStyle().fontColor(Color.Green)Button('修改Prop数据').btnStyle(() => {this.content = '我是Prop数据'})}}
}@Component
struct Index_link {@Link content_link: stringbuild() {Column() {Text('link:' + this.content_link).textStyle().fontColor(Color.Red)Button('修改Link数据').btnStyle(()=>{this.content_link = '我是Link数据'}).backgroundColor(Color.Red)}}
}// 文本公共样式
@Extend(Text) function textStyle() {.fontSize(30).fontWeight(FontWeight.Bold)
}
// 按钮公共样式
@Extend(Button) function btnStyle(click: Function) {.backgroundColor(Color.Green).fontSize(25).margin(10).onClick(() => {click()})// .click()
}

效果:
请添加图片描述

父孙组件传递 @Provide@Consume 与后代组件双向同步

父孙组件可以使用@Link来进行双向绑定,但是和子组件来说的话没法进行区分,所以需要使用@Provide@Consume来进行区分。
例:

@Entry
@Componentstruct  Index{@Provide message:string = '我是父组件'build(){Row(){Column({space:20}){Text(this.message).IndexTextStyle().onClick(()=>{this.message = 'Southern Wind'})Divider()Index_son()}.width('100%')}.height('100%')}
}@Component
struct Index_son{build(){Column({space:30}){Text('子组件').IndexTextStyle()Divider()Index_sun()}}
}@Component
struct Index_sun{@Consume message:stringbuild(){Column(){Text('孙组件' + this.message).IndexTextStyle().onClick(()=>{this.message = 'HarmonyOS 4.0'})}}
}@Extend(Text) function IndexTextStyle() {.fontSize(30)
}

请添加图片描述

其中@Provide装饰的变量是在祖先节点中,可以理解为被“提供”给后代的状态变量。@Consume装饰的变量是在后代组件中,去“消费(绑定)”祖先节点提供的变量。

** @Provide/@Consume装饰的状态变量有以下特性:**

  • @Provide装饰的状态变量自动对其所有后代组件可用,即该变量被“provide”给他的后代组件。由此可见,@Provide的方便之处在于,开发者不需要多次在组件之间传递变量。
  • 后代通过使用@Consume去获取@Provide提供的变量,建立在@Provide@Consume之间的双向数据同步,与@State/@Link不同的是,前者可以在多层级的父子组件之间传递。
  • @Provide@Consume可以通过相同的变量名或者相同的变量别名绑定,变量类型必须相同。
// 通过相同的变量名绑定
@Provide a: number = 0;
@Consume a: number;// 通过相同的变量别名绑定
@Provide('a') b: number = 0;
@Consume('a') c: number;

如果@Provide@Consume绑定的变量名不相同,则可以通过变量别名来区分。

// 通过相同的变量别名绑定
@Provide('a') b: number = 0;
@Consume('d') c: number

@Watch:状态变量更改通知

@Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数。

@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(===),遵循严格相等规范。当在严格相等为false的情况下,就会触发@Watch的回调。

@Entry
@Component
struct Index {@State @Watch('change') count:number = 0@State num:number = 2@State total:number = 0change(){this.total = Math.pow(this.count,this.num)}build() {Row(){Column({space:20}) {Text(`公式:${this.count}^${this.num}=${this.total}`).fontSize(30).fontColor(Color.Blue)Divider()Text('数字:'+this.count).fontSize(30).onClick(()=>{this.count ++})Divider()Text('次方:' + this.num).fontSize(25).onClick(()=>{this.num ++})Divider()Text('结果:'+this.total).fontSize(40)}.width('100%')}.height('100%')}
}

请添加图片描述

当点击次方为文本时无法进行监听,这是因为num只是定义了双向绑定,没有设置状态监听

这时需要将num 添加监听器

 @State @Watch('change') num:number = 0

效果:

当点击次方为文本时无法进行监听,这是因为num只是定义了双向绑定,没有设置状态监听

这时需要将num 添加监听器

 @State @Watch('change') num:number = 0

效果:
请添加图片描述

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

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

相关文章

关于群晖ARPL界面能出现ip但是使用Synology Assistant搜索不到ip问题 及解决方法

文章引用ing304 频道文章:https://qun.qq.com/qqweb/qunpro/share?_wv3&_wwv128&appChannelshare&inviteCode20jx8dPsU2z&contentID1m4NKs&businessType2&from181174&shareSource5&bizka 前言 当进入该界面后 提示IP无法访问&a…

【学习心得】图解Git命令

图解Git命令的图片是在Windows操作系统中的Git Bash里操作截图。关于Git的下载安装和理论学习大家可以先看看我写的另两篇文章。链接我放在下面啦: 【学习心得】Git快速上手_git学习心得-CSDN博客 【学习心得】Git深入学习-CSDN博客 一、初始化仓库 命令&#xff…

eBPF运行时安全

引言 eBPF作为当前linux系统上最为炙手可热的技术,通常被用于网络流量过滤和分析、系统调用跟踪、性能优化、安全监控,当下比较知名的项目有Cilium、Falco等。 Cilium 是一个开源的容器网络和安全性项目,致力于提供高效的容器通信和强大的安…

Java代码审计FastJson反序列化利用链跟踪动态调试autoType绕过

目录 0x00 前言 0x01 基础参考 JNDI注入实例 使用type加入User类解析 FastJson历史漏洞简介 0x02 FastJson 1.2.24 利用链分析 调试过程 构造Poc思路 CC链关键流程 0x03 FastJson 1.2.25-1.2.47 利用链分析 1、开启autoTypeSupport:1.2.25-1.2.41 调试过…

含并行连结的网络(GoogLeNet)

目录 1.GoogLeNet 2.代码 1.GoogLeNet inception不改变高宽,只改变通道数。GoogLeNet也大量使用1*1卷积,把它当作全连接用。 V3耗内存比较多,计算比较慢,但是精度比较准确。 2.代码 import torch from torch import nn from t…

MATLAB - 使用运动学 DH 参数构建机械臂

系列文章目录 前言 一、 使用 Puma560 机械手机器人的 Denavit-Hartenberg (DH) 参数,逐步建立刚体树形机器人模型。在连接每个关节时,指定其相对 DH 参数。可视化机器人坐标系,并与最终模型进行交互。 DH 参数定义了每个刚体通过关节与其父…

非常好用的Mac清理工具CleanMyMac X 4.14.7 如何取消您对CleanMyMac X的年度订购

CleanMyMac X 4.14.7是Mac平台上的一款非常著名同时非常好用的Mac清理工具。全方位扫描您的Mac系统,让垃圾无处藏身,您只需要轻松单击2次鼠标左键即可清理数G的垃圾,就这么简单。瞬间提升您Mac速度。 CleanMyMac X 4.14.7下载地址&#xff1a…

基于LabVIEW的声音信号采集分析系统开发

摘要:以美国国家仪器(NI)公司开发的LabVIEW虚拟仪器为软件开发平台,设计了一个可以同步实现声音信号采集和分析的多功能模块化软件系统.借助LabVIEW图形化软件相应的声音读取、写入和存储函数实现对声音信号的采集、存储、时域分析和频域分析…

行为树(Behavior Trees)

行为树(Behavior Trees)是一种在游戏开发中广泛使用的AI设计模式,主要用于描述AI的行为和决策过程,实现更加智能和自然的游戏AI。它由多个节点组成,每个节点代表一个行为或决策,按照特定的方式连接在一起&a…

C#编程-自定义属性

命名自定义属性 让我们继续漏洞修复示例,在这个示例中新的自定义属性被命名为BugFixingAttribute。通常的约定是在属性名称后添加单词Attribute。编译器通过允许您调用具有短版名称的属性来支持附加。 因此,可以如以下代码段所示编写该属性: [ BugFixing ( 122,"Sara…

U-Boot学习(3):.config、defconfig文件对比及图形化配置Kconfig

在上一节中,我们介绍了U-Boot编译和.config配置文件生成分析,我们可以通过make xxx__defconfig来进行一些配置,其中xxx__defconfig对应config目录下的基于不同开发板的一些配置,指令执行完后会根据对应的配置在根目录下生成一个.c…

LLM之幻觉(二):大语言模型LLM幻觉缓减技术综述

LLM幻觉缓减技术分为两大主流,梯度方法和非梯度方法。梯度方法是指对基本LLM进行微调;而非梯度方法主要是在推理时使用Prompt工程技术。LLM幻觉缓减技术,如下图所示: LLM幻觉缓减技术值得注意的是: 检索增强生成&…

将Sqoop与Hive集成无缝的数据分析

将Sqoop与Hive集成是实现无缝数据分析的重要一步,它可以将关系型数据库中的数据导入到Hive中进行高级数据处理和查询。本文将深入探讨如何实现Sqoop与Hive的集成,并提供详细的示例代码和全面的内容,以帮助大家更好地了解和应用这一技术。 为…

bee工具的使用及创建第一个项目

前提文章:beego的安装及配置参数说明-CSDN博客 提示:beego框架下项目需要再GOPATH/src下进行开发,我的GOPATH是C:\Users\leell\go web项目创建 通过 bee new 创建web项目 C:\Users\leell\go\src>bee new beego-web 2024/01/15 21:40:0…

详细讲解Python连接Mysql的基本操作

目录 前言1. mysql.connector2. pymysql 前言 连接Mysql一般有几种方法,主要讲解mysql.connector以及pymysql的连接 后续如果用到其他库还会持续总结! 对于数据库中的表格,本人设计如下:(为了配合下面的操作) 1. mysql.connector mysql.connector 是一…

自动化的自动化(1)--OPCUA2HTML5

现在的自动化工程师是令人沮丧的,他们努力地实现各个行业的自动化系统,自己却停留在敲键盘的手工劳作的阶段,该解放自己了。这就是“自动化实现自动化”的话题。 OPC 统一架构(简称 OPC UA)是现代工厂自动化中用于机器…

漏洞复现-Yearning front 任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

身体互联网 (IoB)

现在,我们的互联网网关就是我们手中的一个小设备。 普渡大学副教授施里亚斯森表示。 我们不断地看着这个盒子,我们低着头走路,我们把大部分时间都花在它上面。如果我们不想让这种未来继续下去,我们就需要开发新技术。相反&#x…

#RAG##AIGC#检索增强生成 (RAG) 基本介绍和入门实操示例

本文包括RAG基本介绍和入门实操示例 RAG 基本介绍 通用语言模型可以进行微调以实现一些常见任务,例如情感分析和命名实体识别。这些任务通常不需要额外的背景知识。 对于更复杂和知识密集型的任务,可以构建基于语言模型的系统来访问外部知识源来完成任…

系统架构11 - 数据库基础(上)

数据库基础 数据库基本概念概述三级模式、两级映像概念模式外模式内模式二级映像逻辑独立性物理独立性 数据库设计需求分析概念结构设计逻辑结构设计物理设计数据库实施阶段据库运行和维护阶段 数据模型E-R模型关系模型模型转换E-R图的联系 关系代数 数据库基本概念 概述 数据…