鸿蒙前端开发4-ArkTS语言状态管理
1.运行时状态变化带来的UI的重新渲染,在ArkTS统称为状态管理机制
2.状态变量:被状态装饰器装饰的变量,状态变量值的改变会引起UI的渲染更新。状态state和ui/view的关系
View(ui):UI渲染指build方法内的UI描述和@Build装饰器的方法内的UI描述映射到界面
State:状态,指驱动UI更新的数据。用户通过触发事件方法,改变状态数据。状态数据改变,引起UI的重新渲染
3.常规变量:没有被状态装饰器装饰的变量,通常应用于辅助计算。它的改变永远不会引起UI的刷新
4.数据源/同步源:状态变量的原始来源,可以同步给不同的状态数据。通常意义为父组件传给子组件的数据
5.命名参数机制:父组件通过指定参数传递给子组件的状态变量,为父子传递同步参数的主要手段
6.从父组件初始化:父组件使用命名参数机制,将指定参数传递给子组件。子组件初始化的默认值在有父组件传值的情况下,会被覆盖
7.初始化子节点:父组件中状态变量可以传递给子组件,初始化子组件对应的状态变量
8.本地初始化:在变量声明的时候赋值,作为变量的默认值
9.装饰器
上图中,Components部分的装饰器为组件级别的状态管理,Application部分为应用的状态管理。开发者可以通过@StorageLink/@LocalStorageLink实现应用和组件状态的双向同步,通过@StorageProp/@LocalStorageProp实现应用和组件状态的单向同步
a.组件级别的状态管理
@State:@State装饰的变量拥有其所属组件的状态,可作为其子组件单向和双向的数据源,当其数值改变时,会引起相关组件的渲染刷新
允许装饰的类型:Object、class、string、number、boolean、enum
@Prop:@Prop装饰器的变量可以和父组件建立起单向数据同步,@Prop装饰的变量是可变的,但修改不会同步回父组件
1.允许变量本地修改,但修改后的变化不会同步回父组件、
2.当父组件的数据源更改时,与之相关的@Prop装饰的变量都会自动更新。如果子组件@prop修饰的相关变量在本地修改,而父组件对应的@state装饰的变量修改后,子组件本地修改的@prop装饰的相关变量将被覆盖
3.不在@Entry中使用
4.允许装饰的类型:string、number、boolean、enum
@Link:@Link装饰的变量和父组件构建双向同步关系的状态变量,父组件接受来自@Link装饰的变量的修改同步,父组件更新也会同步给@Link装饰的变量,@Link装饰器不能在@Entry装饰的自定义组件中使用,允许装饰的类型:Object、class、string、number、boolean、enum
@Provide/@Consume:@Provide/@Consume装饰的变量用于跨组件层级(多层级)同步状态变量,可以不需要通过参数命名机制传递,通过alias别名或者属性绑定
允许装饰的类型:Object、class、string、number、boolean、enum
@Provide初始化规则图示
@Consume初始化规则图示
@Observed:@Observed装饰class,需要观察多层嵌套(嵌套对象或数组)场景的class需要被@Observed装饰,单独使用@Observed没有任何作用,需要和@ObjectLink和@Prop连用
@ObjectLink:@ObjectLink装饰的变量接收@Observed装饰的class实例,应用于观察多层嵌套场景,和父组件的数据源构成双向数据同步
使用@Observed装饰class会改变class原始的原型链,@Observed和其他类装饰器装饰同一个class可能会带来问题
@ObjectLink装饰器不能在@Entry装饰的自定义组件中使用
b.应用级别状态管理
AppStorage是应用程序中的一个特殊的单例LocalStorage对象,是应用级的数据库,和进程绑定,通过@StorageProp和@StorageLink装饰器可以和组件联动
AppStorage是应用状态的“中枢”,将需要与组件(UI)交互的数据存入AppStorage,比如持久化数据PersistentStorage和环境变量Environment。UI再通过AppStorage提供的装饰器或者API接口,访问这些数据
LocalStorage,AppStorage是LocalStorage特殊的单例。LocalStorage是应用程序声明的应用状态的内存“数据库”,通常用于页面级的状态共享,通过@LocalStorageProp和@LocalStorageLink装饰器可以和UI联动
PersistentStorage:持久化存储UI状态,通常和AppStorage配合使用,选择AppStorage存储的数据写入磁盘,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同
Environment:应用程序运行的设备的环境参数,环境参数会同步到AppStorage中,可以和AppStorage搭配使用
c.其他状态管理
@Watch用于监听状态变量的变化。
$$运算符:给内置组件提供TS变量的引用,使得TS变量和内置组件的内部状态保持同步