前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >ArkTS-状态管理概述

ArkTS-状态管理概述

作者头像
酒楼
发布2023-06-27 14:43:07
发布2023-06-27 14:43:07
60300
代码可运行
举报
文章被收录于专栏:酒楼酒楼
运行总次数:0
代码可运行

状态管理概述

在之前的描述中,我们构建的页面多为静态页面。如果希望构建一个动态地,有交互的页面,就需要引入“状态”的概念

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

自定义组件拥有变量,变量必须被装饰器装饰才可以成为状态变量,状态变量的改变会引起UI的渲染刷新。如果不使用状态变量,UI只能在初始化时渲染,后续将不会再刷新。

基本概念

  • 状态变量:被状态装饰器装饰的变量,改变会引起UI的渲染更新
  • 常规变量:没有状态的变量,通常应用于辅助计算。它的改变永远不会引起UI的刷新。
  • 数据源/同步源:状态变量的原始来源,可以同步给不同的状态数据。通常意义为父组件传给子组件的数据。
  • 命名参数机制:父组件通过指定参数传递给子组件的状态变量,为父子传递同步参数的主要手段。示例:ComA:({aProp:this.aProp})
  • 从父组件初始化:父组件使用命名参数机制,将指定参数传递给子组件。本地初始化的默认值在有父组件传值的情况下,会被覆盖。示例:
代码语言:javascript
代码运行次数:0
复制
@Component
struct MyComponent{
    @State count: number = 0;
    private increaseBy: number = 1;
    
    build(){
        
    }
}

@Component
struct Parent{
    build(){
        Column(){
            //从父组件初始化,覆盖本地定义的默认值
            MyComponent({count:1 ,increaseBy: 2})
        }
    }
}
  • 初始化子节点:组件中状态变量可以传递给子组件,初始化自租金对应的状态变量。示例同上。
  • 本地初始化:变量声明的时候赋值,座位初始化的默认值。示例:@State count:number=0。

装饰器总览

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

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

从数据的传递形式和同步类型层面看,装饰器也可分为:

  • 只读的单向传递;
  • 可变更的双向传递。

上图中,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的实例,应用于观察多层嵌套场景,和父组件的数据源构建双向同步。

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

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

其他状态管理功能

@Watch用于监听状态变量的变化

$$运算符:给内置组件提供TS变量的引用,使得TS变量和内置组件的内部状态保持同步

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 状态管理概述
    • 基本概念
    • 装饰器总览
    • 其他状态管理功能
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档