状态管理模块 提供了应用程序的数据存储能力
应用状态
AppStorage 是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建的,为应用程序UI状态属性提供中央存储;
初始化使用AppStorage.setOrCreate(key,value)
setOrCreate(key,value) //设置或创建(存对象)
限制:AppStorage对象和字符串都可以存储,一旦持久化时只能存字符串; AppStorage支持多页面
单向 @StorageProp('user')组件内可变
双向 @StorageLink('user')全局均可变
AppStorage两种使用方式
为什么AppStorage提供两种使用方式
1:不同场景使用其一通过UI装饰器使用
2:通过API逻辑使用,可以脱离UI在纯JS中使用(脱离UI用不了装饰器)可以通过API逻辑使用
创建应用级的状态
setOrCreate(user,{name:'jack',age:22})
注意: 如果存储的是简单类型使用Prop 如果存储的是对象类型使用Link
通过UI装饰器使用,
import { User } from '../models'
AppStorage.SetOrCreate('user',{name:'jack',age:22})
@Entry
@Component
struct Index {
@StorageLink('user')
user:User={}
build() {
Column({space:15}){
Text(this.user.name+this.user.age)
}
.height('100%')
.width('100%')
}
}
export class User{
name?:string
age?:number
}
通过API逻辑使用,可以脱离UI(可以在纯JS中使用,脱离UI用不了装饰器)
场景:登录请求的token携带,可以去独立的arkTS中取数据
`AppStorage.Get<ValueType>(key)` 获取数据
`AppStorage.Set<ValueType>(key,value)` 覆盖数据
覆盖数据的颗粒度更细
`const link: SubscribedAbstractProperty<ValueType> = AppStorage.Link(key)` 覆盖数据
`link.set(value)` 修改
`link.get()` 获取
Example
import promptAction from '@ohos.promptAction'
import { User } from '../models'
AppStorage.SetOrCreate<User>('user', { name: 'jack', age: 18 })
@Entry
@Component
struct Index {
@StorageLink('user')
user: User = {}
build() {
Column({ space: 15 }) {
Text('Index:')
Text(this.user.name + this.user.age)
.onClick(() => {
this.user.age++
})
Divider()
Text('Get()')
.onClick(() => {
// 获取
const user = AppStorage.Get<User>('user')
promptAction.showToast({
message: JSON.stringify(user)
})
})
Text('Set()')
.onClick(() => {
// 覆盖数据
AppStorage.Set<User>('user', {
name: 'tom',
age: 100
})
// 观察页面更新没
})
Text('Link()')
.onClick(() => {
// 更细粒度的数据修改
const user: SubscribedAbstractProperty<User> = AppStorage.Link('user')
user.set({
name: user.get().name,
// 获取后修改
age: user.get().age + 1
})
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}