HarmonyOS之应用状态-AppStorage数据管理

459 阅读2分钟

状态管理模块 提供了应用程序的数据存储能力

应用状态
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)
  }
}