[二、状态管理]2管理组件拥有的状态(4)@Provide装饰器和@Consume装饰器:与后代组件双向同步

news/2024/11/17 10:43:55/文章来源:https://www.cnblogs.com/strengthen/p/18273996

@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,@Provide和@Consume摆脱参数传递机制的束缚,实现跨层级传递。

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

说明

从API version 9开始,这两个装饰器支持在ArkTS卡片中使用。

概述

@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修饰的变量和@Consume修饰的变量是一对多的关系。不允许在同一个自定义组件内,包括其子组件中声明多个同名或者同别名的@Provide装饰的变量。

装饰器说明

@State的规则同样适用于@Provide,差异为@Provide还作为多层后代的同步源。

@Provide变量装饰器

说明

装饰器参数

别名:常量字符串,可选。

如果指定了别名,则通过别名来绑定变量;如果未指定别名,则通过变量名绑定变量。

同步类型

双向同步。

从@Provide变量到所有@Consume变量以及相反的方向的数据同步。双向同步的操作与@State和@Link的组合相同。

允许装饰的变量类型

Object、class、string、number、boolean、enum类型,以及这些类型的数组。嵌套类型的场景请参考观察变化。

不支持any,不支持简单类型和复杂类型的联合类型,不允许使用undefined和null。

必须指定类型。@Provide变量的@Consume变量的类型必须相同。

 
说明

不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类型。

被装饰变量的初始值

必须指定。

@Consume变量装饰器

说明

装饰器参数

别名:常量字符串,可选。

如果提供了别名,则必须有@Provide的变量和其有相同的别名才可以匹配成功;否则,则需要变量名相同才能匹配成功。

同步类型

双向:从@Provide变量(具体请参见@Provide)到所有@Consume变量,以及相反的方向。双向同步操作与@State和@Link的组合相同。

允许装饰的变量类型

Object、class、string、number、boolean、enum类型,以及这些类型的数组。嵌套类型的场景请参考观察变化。

不支持any,不允许使用undefined和null。

必须指定类型。@Provide变量的@Consume变量的类型必须相同。

 
说明
  • @Consume装饰的变量,在其父节点或者祖先节点上,必须有对应的属性和别名的@Provide装饰的变量。

被装饰变量的初始值

无,禁止本地初始化。

变量的传递/访问规则说明

@Provide传递/访问

说明

从父组件初始化和更新

可选,允许父组件中常规变量、@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp装饰的变量装饰变量初始化子组件@Provide。

用于初始化子组件

允许,可用于初始化@State、@Link、@Prop、@Provide。

和父组件同步

否。

和后代组件同步

和@Consume双向同步。

是否支持组件外访问

私有,仅可以在所属组件内访问。

图1 @Provide初始化规则图示

 

@Consume传递/访问

说明

从父组件初始化和更新

禁止。通过相同的变量名和alias(别名)从@Provide初始化。

用于初始化子组件

允许,可用于初始化@State、@Link、@Prop、@Provide。

和祖先组件同步

和@Provide双向同步。

是否支持组件外访问

私有,仅可以在所属组件内访问

图2 @Consume初始化规则图示

观察变化和行为表现

观察变化

  • 当装饰的数据类型为boolean、string、number类型时,可以观察到数值的变化。
  • 当装饰的数据类型为class或者Object的时候,可以观察到赋值和属性赋值的变化(属性为Object.keys(observedObject)返回的所有属性)。
  • 当装饰的对象是array的时候,可以观察到数组的添加、删除、更新数组单元。

框架行为

  1. 初始渲染:
    1. @Provide装饰的变量会以map的形式,传递给当前@Provide所属组件的所有子组件;
    2. 子组件中如果使用@Consume变量,则会在map中查找是否有该变量名/alias(别名)对应的@Provide的变量,如果查找不到,框架会抛出JS ERROR;
    3. 在初始化@Consume变量时,和@State/@Link的流程类似,@Consume变量会保存在map中查找到的@Provide变量,并把自己注册给@Provide。
  2. 当@Provide装饰的数据变化时:
    1. 通过初始渲染的步骤可知,子组件@Consume已把自己注册给父组件。父组件@Provide变量变更后,会遍历更新所有依赖它的系统组件(elementid)和状态变量(@Consume);
    2. 通知@Consume更新后,子组件所有依赖@Consume的系统组件(elementId)都会被通知更新。以此实现@Provide对@Consume状态数据同步。
  3. 当@Consume装饰的数据变化时:
    1. 通过初始渲染的步骤可知,子组件@Consume持有@Provide的实例。在@Consume更新后调用@Provide的更新方法,将更新的数值同步回@Provide,以此实现@Consume向@Provide的同步更新。

使用场景

在下面的示例是与后代组件双向同步状态@Provide和@Consume场景。当分别点击CompA和CompD组件内Button时,reviewVotes 的更改会双向同步在CompA和CompD中。

@Component
struct CompD {// @Consume装饰的变量通过相同的属性名绑定其祖先组件CompA内的@Provide装饰的变量
  @Consume reviewVotes: number;build() {Column() {Text(`reviewVotes(${this.reviewVotes})`)Button(`reviewVotes(${this.reviewVotes}), give +1`).onClick(() => this.reviewVotes += 1)}.width('50%')}
}@Component
struct CompC {build() {Row({ space: 5 }) {CompD()CompD()}}
}@Component
struct CompB {build() {CompC()}
}@Entry
@Component
struct CompA {// @Provide装饰的变量reviewVotes由入口组件CompA提供其后代组件@Provide reviewVotes: number = 0;build() {Column() {Button(`reviewVotes(${this.reviewVotes}), give +1`).onClick(() => this.reviewVotes += 1)CompB()}}
}

 

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

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

相关文章

dedecms搭建网站怎么更换编辑器

入口: 系统 > 系统设置 > 系统基本参数 > 核心设置 > 编辑器默认可选参数: wangEditor 、 ckeditor 、 fck本文来自博客园,作者:黄文Rex,转载请注明原文链接:https://www.cnblogs.com/hwrex/p/18294690

DedeCMS网站安装成功后点击登录网站后台报404错误怎么办?

DedeCMS 默认的管理后台路径为 /dede 。遇到这个问题,需先检查 /dede 目录是否被重命名了。如果被重命名了,改回 /dede 即可。或直接在浏览器地址栏手动输入相应的管理后台路径,就可以打开后台登录页面了。本文来自博客园,作者:黄文Rex,转载请注明原文链接:https://www.…

关于DedeCMS版本号的说明

DedeCMS V5.7.73及后续的版本将采用 Semantic Versioning Specification (SemVer)(语义化版本 2.0.0) 进行维护。 语义化版本 2.0.0版本格式:主版本号.次版本号.修订号,版本号递增规则如下: 1、主版本号:当你做了不兼容的 API 修改, 2、次版本号:当你做了向下兼容的功能性…

zblog报错“Invalid argument supplied for foreach”或者“unserialize(): Error at offset”的解决办法

大部分的报错提示是:”Invalid argument supplied for foreach“也有提示”unserialize(): Error at offset“的,本文来分享下这个bug的原因和解决办法。 BUG原因: zblog1.7版本改造了system的config表,这个表里面存放的是程序的核心内容,例如域名、语言版本、网站名称等等…

PC触摸屏之设备维护【PackGo】

TIA Portal V16平台Pack&Go功能如何使用? TIA Portal V16平台Pack&Go功能如何使用 (siemens.com.cn)简介 当我们无法建立从组态PC到HMI设备的直接连接,例如,现场PC未安装TIA Portal软件,还需要将项目下载到HMI设备,除了使用U盘方式下载程序外,还可以创建P…

ZBlog网站固定域名出错不能登入

使用空间面板的文件管理或者 FTP 修改文件:path/zb_users/c_option.php; 如果是固定域名出错,需要关闭固定域名功能,请在 c_option.php增加项目: ZC_PERMANENT_DOMAIN_ENABLE => false, //1.7.3版本及以后版本使用//或是 ZC_PERMANENT_DOMAIN_WHOLE_DISABLE => true…

imagecreatefrompng(): gd-png: libpng warning: iCCP: known incorrect sRGB profile

问题描述: imagecreatefrompng(): gd-png: libpng warning: iCCP: known incorrect sRGB profile 解决方法: 更新 GD 库或 调整PHP版本宝塔的话, 可以安装依赖yum install libpng libpng-devel -y补充: 如果后台先安装的“一条大河应用盒子”,这个也启用一下, 不然也会报…

记一次【PPT制作、PPT在线编辑预览】功能开发过程

背景 早上,正愉快写着helloWord(Java)。老大对我来了句,搞个【 根据用户输入的markdow文本内容,将数据插入到PPT模板中,生成新的PPT文件。并且要可以在线预览以及编辑】 。(ps:就是直接照着人家的功能抄一个出来,参考网址:https://www.*******.vip)。并且跟…

RPC api与Rest api的区别 微服务 正反向代理

参考链接:https://blog.csdn.net/weixin_43871785/article/details/129922143RPC:本地化 REST:国际化 HTTP 与 RPC 的关系就好比国际化与地方化的关系(可以认为标准的国际拳击手和随意的自由拳击手)。 要进行跨企业服务调用时,往往都是通过 HTTP API, 虽然效率不高,但是通…

易优CMS模板标签arcview单条文档输出单页模型栏目的详细内容

[基础用法]标签:arcview描述:获取单条文档数据用法: {eyou:arcview aid=文档ID} <a href="{$field.arcurl}">{$field.title}</a> {/eyou:arcview} 属性: aid= 指定文档ID,如果没有指定则获取当前文档内容页的文档ID id= 可以任意指定循环里的变量…

[二、状态管理]2管理组件拥有的状态(2)@Prop装饰器:父子单向同步

@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的变量是可变的,但是变化不会同步回其父组件。说明从API version 9开始,该装饰器支持在ArkTS卡片中使用。概述 @Prop装饰的变量和父组件建立单向的同步关系:@Prop变量允许在本地修改,但修改后的变化不会同步回父组…

SQL漏洞--简介及数字型注入

数据库注入漏洞主要指开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。 一、数字型注入: 通过pikachu搭建的靶场进行SQL数字型注入测试:一、 数字…