鸿蒙状态管理
我们开发中构建的页面多为静态页面。如果希望构建一个动态的,有交互的界面,就需要引入‘状态’的概念
用户构建了一个UI模型,其中应用的运行时的状态是参数,当参数改变时,UI作为返回结果,也将进行对应的改变。状态变化带来UI的重新渲染。
自定义组件拥有变量所谓属性,必须被装饰器修饰才可以成为状态变量,状态变量的改变会引起UI的渲染刷新,如果不使用状态变量,UI只能在初始化时渲染,后续将不会再刷新。
State状态:驱动UI更新的数据,用户通过触发组件的事件方法,改变状态数据。状态数据的改变,引起UI的重新渲染,只能在@component装饰修饰的组件中使用
常规变量:没有被状态装饰器修饰的变量,通常应用于辅助计算。它的改变不会引起UI的刷新。
数据源/同步源:状态变量的原始来源,可以同步给不同的状态数据,通常意义为父组件传给子组件的数据,以下示例中数据源为count:1
命名参数机制:父组件通过指定参数传递给子组件的状态变量,为父子传递同步参数的主要手段。示例CompA({aProp:this.aProp})
从父组件初始化,父组件使用命名参数机制,将指定参数传递给子组件。子组件初始化的默认值在有父组件传值的情况下,会被覆盖
@Component
struct MyComponent {
@State count: number = 0;
private increaseBy: number = 1;
build() {
}
}
@Component
struct Parent {
build() {
Column() {
// 从父组件初始化,覆盖本地定义的默认值
MyComponent({ count: 1, increaseBy: 2 })
}
}
}
装饰器总览
ArkUI状态管理提供了多种装饰器,通过使用这些装饰器,状态变量不仅可以观察在组件内的改变,还可以在不同组件层级间传递(也就是在挂载View里面的传值),比如父子组件(单页面挂载的子视图),跨组件(跨页面,比如push)层级,也可以观察全局范围内的变化(比如AppStorage修饰的)。根据状态变量的影响范围,将所有的装饰器可以大致分为
1.组件级别的状态管理,可以观察组件内变化,和不同组件层级的变化,但需要同一个页面内
2.可以观察不同页面,甚至不同UIAbility的状态变化。是应用内全局的状态管理
从数据传递的同步类型层面可以分为
1.只读的单项传递
2.可变更的双向传递
上图,Component为组件级别的状态管理,单页面内的
Application为应用管理的状态管理。
开发者可以通过@StorageLimk实现应用状态的双向同步
可以通过@LocalStorageLikn实现单页面组件状态的双向同步
可以通过@StorageProp实现应用的单向同步
可以通过@LocalStorageProp实现单页面组件状态的单向同步
管理组件拥有的状态,即图中Components级别的状态管理
@state:@State装饰的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源,当其数值改变时,会引起相关组件的渲染刷新
@state装饰的变量与子组件中的@Prop装饰变量之间建立单向数据同步,与@Link,@ObjectLink装饰变量之间建立双向数据同步
@State装饰的变量生命周期与其所属自定义的生命周期相同
@Prop:@Prop装饰的变量可以和父组件建立单向同步关系,@Prop装饰的变量时可变的,但修改不会同步回父组件
@Link:@Link装饰的变量可以和父组件建立双向同步关系,子组件中@Link装饰变量的修改会同步给父组件中,建立双向数据绑定的数据源,父组件的更新也会同步给@Link装饰的变量
@P