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

一、介绍

资料来自官网:文档中心

在声明式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:string
  build() {
    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:string
  build() {
    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可以通过相同的变量名或者相同的变量别名绑定,变量类型必须相同。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑提醒待办事项:高效、快捷、更科学的方法

在这个快节奏的社会里,我常常感到时间不够用,仿佛一天24小时根本不够我分配。每天都有一大堆待办事项等着我,但总是有这样那样的事情让我分心,导致我经常忘记一些重要的任务。 每次当我想起那些被遗忘的待办事项时,都…

本地创建Git仓库

在 Windows 下,可以通过以下步骤在本地创建一个 并模拟远程Git 仓库。 1、在命令行中打开模拟远程Git 仓库目标文件夹: 打开命令提示符或 PowerShell。例如: 创建裸仓库(模拟远程仓库):创建一个裸仓库&am…

亚马逊、沃尔玛、eBay等跨境平台自养号测评的风险和技术解析

亚马逊等平台延伸至世界各地,竞争激烈。许多卖家使用自养号测评来提高产品排名和销量。但自养号测评技术存在一定的技术局限性,很多卖家的账号因对自养号原理和底层环境搭建缺乏了解很多卖家的账号被关联封禁。本文将为您揭示自养号测评的风险&#xff0…

【小呆的力学笔记】弹塑性力学的初步认知四:简单应力状态下的应力应变关系

文章目录 2. 简单应力状态下的应力应变关系2.1 简单拉伸的应力应变关系2.2 真实应力应变关系2.3 应力-应变关系简化模型 2. 简单应力状态下的应力应变关系 我们在高中就学过,弹簧拉伸力和变形量成比例,对于一般的金属材料,在一定载荷以内这种…

Cadence Allegro PCB设计88问解析(三十三) 之 Allegro 中 Quick Reports的使用

一个学习信号完整性仿真的layout工程师 在进行PCB设计时,经常会查看一下整个PCB的基本信息,比如器件个数,网络数量、pin的数量。尤其在投板的时候还要查看下Dangling Lines、Dangling Vias等。还有其他的关于shape、via、走线、钻孔等等相关信…

顶顶通实时质检系统如何添加词库

文章目录 前言联系我们步骤1. 导入系统预置词库2. 手动添加词库 在实时质检时如何质检到词库 前言 本篇文章主要讲解顶顶通实时质检系统如何添加词库。 词库添加的方式: 导入系统预置词库手动添加词库 联系我们 有意向了解实时质检系统的用户,可以点击…

Photoshop 2023(Ps)下载安装及详细安装教程

Photoshop(Ps)的介绍 Adobe Photoshop,简称“PS”,是由AdobeSystems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具,可以有效地进行图片编辑和创造工作。PS有很多功能,在图像、…

grafana配置钉钉告警模版(一)

1、配置钉钉告警模版 创建钉钉告警模版,然后在创建钉钉告警时调用模版。 定义发送内容具体代码 my_text_alert_list 是模版名称后面再配置钉钉告警时需要调用。 {{/* 定义消息体片段 */}} {{ define "my_text_alert_list" }}{{ range . }}告警名称&…

术业有专攻!三防加固平板助力工业起飞

在日常使用中的商业电脑比较追求时效性,以市场定位做标准,内部元件只需满足一般要求就行,使用寿命比较短。而三防平板电脑是主要运用在复杂、恶劣的环境下所以在需求方面较高,需要保证产品在恶劣条件下正常使用,满足行业领域的需求…

springboot746旧物置换网站

springboot746旧物置换网站 获取源码——》公主号:计算机专业毕设大全

二维码钓鱼激增587%:用户陷入社交诈骗陷阱!

Check Point软件技术公司发布的新研究揭示了典型的QR码攻击,通过Check Point的实时网络威胁地图,在两周内发现了2万起QR码钓鱼和恶意软件攻击事件,突显了QR码在网络犯罪分子面前的脆弱性。 QR码是"Quick Response Code"&#xff08…

minio+nginx 集群快速搭建

文章目录 1、概要2、整体架构流程3、集群搭建3.1、服务器准备3.2、下载并安装3.3、minio集群配置3.4、minio.service配置3.5、启动 4、nginx 转发 1、概要 minIO 是一个开源的分布式对象存储服务,可用于构建高可用性和高扩展性的存储集群。 分布式架构:…

SpringSecurity + OAuth2 详解

SpringSecurity入门到精通 ************************************************************************** SpringSecurity 介绍 **************************************************************************一、入门1.简介与选择2.入门案例-默认的登录和登出接口3.登录经过了…

CSS SVG技术制作的复杂多层发光星形加载动画组件

<template><!-- 定义一个视图容器,用于展示加载动画 --><view class="loader"><svg viewBox="0 0 128 128" height="128" width="128" class="star"><defs><filter id="star-glow&q…

Windows下用CMake编译ITK及配置测试

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 ITK是什么&#xff1f; ITK&#xff08; Insight Segmentation and Registration Toolkit&#xff09;是美国国家卫生院下属的国…

MBD_入门篇_18_Simulink查表模块

18.Simulink查表模块 18.1 概述 LookUpTable&#xff0c;查表模块。比较常用的模块&#xff0c;参数较多&#xff0c;会复杂一点&#xff0c;比较重要的模块&#xff0c;一定掌握。 18.2 n-DLookUpTable N维查表模块 18.2.1 查表原理 通过有限的数据去得出相关的结果。比如我们…

Leo赠书活动-16期 名校毕业生教材

Leo赠书活动-16期 名校毕业生教材 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠…

Netdata:实时高分辨率监控工具 | 开源日报 No.173

netdata/netdata Stars: 63.9k License: GPL-3.0 Netdata 是一个监控工具&#xff0c;可以实时高分辨率地监视服务器、容器和应用程序。 以下是该项目的主要功能&#xff1a; 收集来自 800 多个整合方案的指标&#xff1a;操作系统指标、容器指标、虚拟机、硬件传感器等。实…

unity学习(29)——GameInfo角色信息

1.把GameInfo.cs PlayerModel.cs Vector3.cs Vector4.cs PlayerStateConstans.cs GameState.cs依次粘到model文件夹中&#xff0c;此时项目没有错误&#xff0c;如下图所示&#xff1b; 对应处所修改的代码如下&#xff1a; case LoginProtocol.LOGIN_SRES://1 {Debug.Log(&qu…

Sora新视角:从介绍到商业价值,全面解读优势

关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&…