前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ArkTS-PersistentStorage持久化存储UI状态

ArkTS-PersistentStorage持久化存储UI状态

作者头像
酒楼
发布2023-07-05 16:19:37
6280
发布2023-07-05 16:19:37
举报
文章被收录于专栏:酒楼

PersistentStorage:持久化存储UI状态

前两个小阶介绍的LocalStorage和AppSotrage都是运行时的内存,但是在应用退出再次启动后,依然能保存选定的结果,是应用开发中非常常见的现象,这就需要用到PersistentStorage。

PersistentStorage是应用程序找那个的可选单例对象。此对象的作用是持久化存储选定的AppStorage属性,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。

概述

PersistentStorage将选定的AppStorage属性保留在设备磁盘上。应用程序通过API,以决定哪些AppStorage属性应结束PersistentStorage持久化。UI和业务逻辑不直接访问PersistentStorage中的属性,所有属性访问都是对AppStorage的访问,AppStorage中的更改会自动同步到PersistentStorage。

PersistentStorage和AppStorage中的属性建立双向同步。应用开发通常通过AppStorage访问PersistentStorage,另外还有一些接口可以用于管理持久化属性,但是业务逻辑始终是通过AppStorage获取和设置属性的。

限制条件

持久化数据是一个相对缓慢的操作,应用逻辑应避免以下情况:

  • 持久化大型数据集。
  • 持久化经常变化的变量。

当持久化更改的过程变得太繁重时,PersistentStorage实现可能会限制持久化属性更改的频率。

使用场景

从AppStorage中访问PersistentStorage初始化的属性
1.初始化PersistentStorage:
代码语言:javascript
复制
PersistentStorage.PersistentProp('aProp',47);
2.在AppStorage获取对应属性:
代码语言:javascript
复制
AppStorage.Get('aProp');//returns 47

​ 或在组件内部定义:

代码语言:javascript
复制
@StorageLink('aProp') aProp: number = 48;

完整代码如下:

代码语言:javascript
复制
PersistentStorage.PersistProp('aProp',47)

@Entry
@Component
struct Index{
    @State message: string = 'Hello World'
    @StorageLink('aProp') aProp:number = 48
    
    build(){
        Row(){
            Column(){
                Text(this.message)
                //应用退出时会保存当前结果。重新启动后,会显示上一次的保存结果
                Text(`${this.aProp}`)
                	.onClick(()=>{
                    this.aProp +=1;
                })
            }
        }
    }
}
  • 新应用安装后首次启动运行:
    • 调用PersistProp初始化PersistentStorage,首先查询再PersistentStorage本地文件中是否存在“aProp”,查询结果为不存在,因为应用是第一次安装。;
    • 接着查询属性“aProp”在AppStorage中是否存在,依旧不存在;
    • 在AppStorage中创建名为“aProp”的number类型属性,属性初始值是定义的默认值47;
    • PersistentStorage将属性“aProp”和值47写入磁盘,AppStorage中“aProp”对应的值和其后续的更改将被持久化;
    • 在Index组件中创建状态变量@StorageLink(‘aProp’)aProp,和AppStorage中“aProp”双向绑定,在创建的过程中会在AppStorage中查找,成功找到“aProp”,所以使用其在AppStorage找到的值47.
  • 触发点击事件后:
    • 状态变量@StorageLink(‘aProp’) aProp改变,触发Text组件重新刷新;
    • @StorageLink装饰的变量是和AppStorage中建立双向同步的,所以@StorageLink(‘aProp’) aProp的变化会被同步回AppStorage中;
    • AppStorage中“aProp“属性的改变会同步到所有绑定该”aProp“的单向或者双向变量,在本实例中没有其他的绑定”aProp”的变量
    • 因为“aProp”对应的属性已经被持久化,所以在AppStorage中“aProp”的改变会触发PersistentStorage将新的改变写回本地磁盘。
  • 后续启动应用:
    • 执行PersistentStorage.PersistProp(‘aProp’,47),在首先查询在PerisistentStorage本地文件查询“aProp”属性,成功查询到;
    • 将在PersistentStorage查询到的值写入AppStorage中;
    • 在Index组件里,@StorageLink绑定的“aProp”为PersistentStorage写入AppStorage中的值,即为上一次退出引用存入的值。

在PersistentStorage之前访问AppStorage中的属性

该示例为反例。在调用PersistentStorage.PersistProp或者PersistProps之前使用接口访问AppStorage中的属性是错误的,因为这样的调用顺序会丢失上一次应用程序运行中的属性值:

代码语言:javascript
复制
let aProp = AppStorage.SetOrCreate('aProp',47);
PersistentStorage.PersistProp('aProp',48);

应用在非首次运行时,先执行AppStorage.SetOrCreate(‘aProp’,47):属性“aProp”在AppStorage中创建,其类型为number,其值设置为指定的默认值47.’aProp‘是持久化的属性,所以会被写回PersistentStorage磁盘中,PersistentStorage存储的上次退出应用的值丢失。

PersistentStorage.PersistProp(‘aProp’,48): 在PersistentStorage中查找到“aProp”,找到,值为47.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PersistentStorage:持久化存储UI状态
    • 概述
      • 限制条件
        • 使用场景
          • 从AppStorage中访问PersistentStorage初始化的属性
        • 在PersistentStorage之前访问AppStorage中的属性
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档