1.1、AppStorage
LocalStorage是针对UIAbility的状态共享- 一个UIAbility有若个页面
一个应用可能有若干个UIAbility
AppStorage 是应用内全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。-注意它也是内存数据,不会写入磁盘
第一种用法-使用UI修饰符
- 如果是初始化使用 AppStorage.SetOrCreate(key,value)
- 单向 @StorageProp('user') 组件内可变
- 双向 @StorageLink('user') 全局均可变
第二种用法 使用API方法
- AppStorage.Get<ValueType>(key) 获取数据
- AppStorage.Set<ValueType>(key,value) 覆盖数据
- const link: SubscribedAbstractProperty<ValueType> = AppStorage.Link(key) 覆盖数据
○ link.set(value) 修改
○ link.get() 获取
页面1
import router from '@ohos.router'
@Entry
@Component
struct AppStorageCase {
build() {
Row() {
Column() {
Row() {
Button('登录')
.width('100%')
.height(40)
.onClick(() => {
// T表示泛型,指定map中值的类型,SetOrCreate设置初始值
AppStorage.SetOrCreate<string>("user_token","1")
router.pushUrl({url:'pages/04/AppStorageCase2'})
})
}
.padding({
left:20,
right:20
})
}
.width('100%')
}
.height('100%')
}
}
页面2
@Entry
@Component
struct AppStorageCase2 {
@StorageProp("user_token") //单向, 取出user_token的值,赋值给token变量
token:string = "" // 通过变量的方式, 初始值""先执行,StorageProp后执行
@StorageLink("user_token") // 双向,可以修改数据
token2:string = ""
aboutToAppear() {
// 通过API的方式取值 T表示泛型,表示取出来的值为string类型
// AppStorage.Get<string>("user_token")
AlertDialog.show({message:AppStorage.Get<string>("user_token")})
}
build() {
Row() {
Column({space:20}) {
Text(this.token)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button('更新token')
.onClick(() => {
this.token2 = 'xxxx' // link可以修改数据
})
}
.width('100%')
}
.height('100%')
}
}
1.2、PersistentStorage
LocalStorage、AppStorage均为内存状态,也就是应用退出便消失,所以如果我们想持久化的保留一些数据,应该使用PersistentStorage。
注意:
UI和业务逻辑不直接访问 PersistentStorage 中的属性,所有属性访问都是对 AppStorage 的访问,AppStorage 中的更改会自动同步到PersistentStorage。
PersistentStorage 将选定的 AppStorage 属性保留在设备磁盘上。
- 支持:number, string, boolean, enum 等简单类型;
- 如果:要支持对象类型,可以转换成json字符串
- 持久化变量最好是小于2kb的数据,如果开发者需要存储大量的数据,建议使用数据库api。
- 用法:PersistentStorage.PersistProp('属性名', 值)
import router from '@ohos.router'
// 初始化磁盘,需要在使用前先初始化
// AppStorage进行Set时,检测到user_token被PersistentStorage修饰时,就会写入磁盘
PersistentStorage.PersistProp<string>("user_token","")
@Entry
只要使用PersistentStorage初始化了数据,我们以后使用AppStorage就可以读取和设置,它会自动同步到我们的磁盘上。
目前不支持复杂对象的持久化,如果你需要存储,你需要把它序列化成功字符串
网友评论