美文网首页鸿蒙
状态管理概述

状态管理概述

作者: wendy__xu | 来源:发表于2024-03-11 19:45 被阅读0次

在声明式UI编程框架中,UI是程序状态的运行结果,最重要的就是状态管理机制。

基本概念

  • 状态变量:被状态装饰器装饰的变量,状态变量值的改变会引起UI的渲染更新。示例:@State num: number = 1,其中,@State是状态装饰器,num是状态变量。
  • 常规变量:不会引起UI的刷新。
  • 数据源/同步源:状态变量的原始来源,可以同步给不同的状态数据。通常意义为父组件传给子组件的数据。
  • 命名参数机制:父组件通过指定参数传递给子组件的状态变量,为父子传递同步参数的主要手段。示例:CompA: ({ aProp: this.aProp })。
  • 从父组件初始化:父组件使用命名参数机制,将指定参数传递给子组件。子组件初始化的默认值在有父组件传值的情况下,会被覆盖。
  • 初始化子节点:父组件中状态变量可以传递给子组件,初始化子组件对应的状态变量。
  • 本地初始化:在变量声明的时候赋值,作为变量的默认值。示例:@State count: number = 0。

装饰器总览

ArkUI提供了多种装饰器,通过使用这些装饰器,状态变量不仅可以观察在组件内的改变,还可以在不同组件层级间传递,比如父子组件、跨组件层级,也可以观察全局范围内的变化。根据状态变量的影响范围,将所有的装饰器可以大致分为:

  • 管理组件拥有状态的装饰器:组件级别的状态管理,可以观察组件内变化,和不同组件层级的变化,但需要唯一观察同一个组件树上,即同一个页面内。

  • 管理应用拥有状态的装饰器:应用级别的状态管理,可以观察不同页面,甚至不同UIAbility的状态变化,是应用内全局的状态管理。
    从数据的传递形式和同步类型层面看,装饰器也可分为:

  • 只读的单向传递;

  • 可变更的双向传递。
    图示如下,具体装饰器的介绍,可详见管理组件拥有的状态管理应用拥有的状态。开发者可以灵活地利用这些能力来实现数据和UI的联动。

image.png

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

管理组件拥有的状态,即图中Components级别的状态管理:

  • @State:@State装饰的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源。当其数值改变时,会引起相关组件的渲染刷新。
  • @Prop:@Prop装饰的变量可以和父组件建立单向同步关系,@Prop装饰的变量是可变的,但修改不会同步回父组件。
  • @Link:@Link装饰的变量和父组件构建双向同步关系的状态变量,父组件会接受来自@Link装饰的变量的修改的同步,父组件的更新也会同步给@Link装饰的变量
  • @Provide/@Consume:@Provide/@Consume装饰的变量用于跨组件层级(多层组件)同步状态变量,可以不需要通过参数命名机制传递,通过alias(别名)或者属性名绑定。
  • @Observed:@Observed装饰class,需要观察多层嵌套场景的class需要被@Observed装饰。单独使用@Observed没有任何作用,需要和@ObjectLink、@Prop连用。
  • @ObjectLink:@ObjectLink装饰的变量接收@Observed装饰的class的实例,应用于观察多层嵌套场景,和父组件的数据源构建双向同步。
    注意:仅@Observed/@ObjectLink可以观察嵌套场景,其他的状态变量仅能观察第一层,详情见各个装饰器章节的“观察变化和行为表现”小节。

管理应用拥有的状态,即图中Application级别的状态管理:

  • AppStorage是应用程序中的一个特殊的单例LocalStorage对象,是应用级的数据库,和进程绑定,通过@StorageProp@StorageLink装饰器可以和组件联动。
  • AppStorage是应用状态的“中枢”,将需要与组件(UI)交互的数据存入AppStorage,比如持久化数据PersistentStorage和环境变量Environment。UI再通过AppStorage提供的装饰器或者API接口,访问这些数据。
  • 框架还提供了LocalStorage,AppStorage是LocalStorage特殊的单例。LocalStorage是应用程序声明的应用状态的内存“数据库”,通常用于页面级的状态共享,通过@LocalStorageProp@LocalStorageLink装饰器可以和UI联动。

其他状态管理功能

  • @Watch用于监听状态变量的变化。
  • $$运算符:给内置组件提供TS变量的引用,使得TS变量和内置组件的内部状态保持同步。

相关文章

  • Day11 - Flutter - 状态State管理

    概述 为什么需要状态管理? 共享状态管理 一. 为什么需要状态管理? 1.1、认识状态管理很多从命令式编程框架(A...

  • Git 快速上手

    概述 Git 管理文件的 4 种状态 未追踪(untracked) 已提交(commited) 已修改(modif...

  • Vuex状态管理

    概述 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并...

  • Linux进程

    概述 监控进程状态 管理进程状态 管理后台进程 进程的优先级 每天我们要守护服务器7*24小时不宕机,会使用一些命...

  • Redux 源码解析

    概述 Redux 是 JavaScript 状态容器,提供可预测化的状态管理方案。其三大原则为: 单一数据源 =>...

  • 操作系统(五)——I/O管理

    I/O管理主要通过对设备状态跟踪对设备存取数据、设备分配、及设备控制进行管理。 (一)I/O管理概述 1. I/O...

  • Vuex学习之路-入门篇

    概述 Vuex是一个专门为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相...

  • K8s -- StatefulSet

    概述 RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序...

  • NgRx

    1. 概述 NgRx 是 Angular 应用中实现全局状态管理的 Redux 架构解决方案 @ngrx/sto...

  • kubernetes——StatefulSet详解

    概述 RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序...

网友评论

    本文标题:状态管理概述

    本文链接:https://www.haomeiwen.com/subject/qtemzdtx.html