arkTS:持久化储存UI状态的基本用法(PersistentStorage)

1 主要内容说明

持久化存储 (PersistentStorage) ,它提供了一种将数据保存到磁盘的机制,使得数据在应用关闭后仍能被保留和访问。通过调用 PersistentStorage.persistProp 方法,可以将各种类型的数据(如数字、字符串、布尔值以及复杂对象)存储起来。例如,代码中存储了用户的年龄、名字、布尔状态,以及包含多个属性的用户信息对象。这些存储的数据会与磁盘同步,确保数据的持久性。

关于后面源码1的内容,为了方便使用,代码通过 @StorageLink 装饰器将持久化存储的数据绑定到组件的属性中。例如,@StorageLink(“age”) 将磁盘中的 age 数据直接关联到组件的 age 属性。这种绑定方式的优势在于,属性值的变化会自动更新到存储中,反之亦然。

此外,源码1还展示了如何动态更新持久化数据。通过按钮点击事件,代码修改了存储中的多个值,例如年龄递增、字符串追加、布尔值变更,以及对象属性的更新。更新后的值会立即反映在存储中,并通过绑定属性实时同步到用户界面。也就是说点击后的效果会一直保持,退出程序后再进入程序,显示的也是上次退出前的状态。对比,若不使用持久化储存,每次关闭程序后再打开,显示的都是初始默认情况的画面,并不会储存上传退出前的状态。

2 例子

2.1 持久化储存UI状态的基本用法(PersistentStorage)

2.1.1 源码1的相关说明

2.1.1.1 数据存储

使用 PersistentStorage.persistProp 方法将各种类型的数据(数值、字符串、布尔值和对象)持久化存储到磁盘,例如:

	数字:PersistentStorage.persistProp("age", 22)
	字符串:PersistentStorage.persistProp("name", "jack")
	布尔值:PersistentStorage.persistProp("bool", true)
	对象:PersistentStorage.persistProp("UserMessage", {...})
2.1.1.2 数据读取

使用 @StorageLink 装饰器将存储的数据绑定到组件的属性中,数据会在组件中自动更新。如:

	@StorageLink("age") age: number = 0; 通过 "age" 属性访问存储的年龄。
2.1.1.3 动态更新

通过点击按钮,更新存储的值,并实时同步到 UI,例如:

	年龄自增:this.age += 1;
	更新对象中的字段:this.myUserMessage.age += 2;
2.1.1.4 显示数据

将存储的值通过 UI 元素(如 Text)展示出来,并支持 JSON 格式化显示对象。

2.1.2 源码1 (持久化储存)

// 定义用户信息的接口,包含名字、年龄、身高三个属性
export interface User_Message {
  name: string;  // 用户的名字
  age: number;   // 用户的年龄
  height: number; // 用户的身高
}

// 使用 PersistentStorage 初始设置磁盘存储的值
// 数值类型存储:年龄
PersistentStorage.persistProp("age", 22);

// 字符串类型存储:名字
PersistentStorage.persistProp("name", "jack");

// 布尔类型存储:一个布尔值
PersistentStorage.persistProp("bool", true);

// 对象类型存储:存储用户信息对象,遵循 User_Message 接口
PersistentStorage.persistProp("UserMessage", { name: "jack", age: 23, height: 168 } as User_Message);

@Entry
@Component
struct Page_PersistentStorage {
  // 将存储的值链接到组件属性
  @StorageLink("age")
  age: number = 0; // 默认值为0

  @StorageLink("name")
  name: string = ""; // 默认值为空字符串

  @StorageLink("bool")
  bool: boolean = false; // 默认值为 false

  @StorageLink("UserMessage")
  myUserMessage: User_Message = {} as User_Message; // 默认值为空对象,类型为 User_Message

  build() {
    Column() {
      // 显示存储的年龄(number 类型)
      Text("储存的年龄age,number类:")
      Text(this.age + "")
        .backgroundColor("#fcc")
        .fontSize(30)
        .margin({ bottom: 30, top: 10 });

      // 显示存储的名字(string 类型)
      Text("储存的名字name,string类:")
      Text(this.name + "")
        .backgroundColor("#ff4bd94b")
        .fontSize(30)
        .margin({ bottom: 30, top: 10 });

      // 显示存储的布尔值
      Text("储存的布尔值bool,boolean类:")
      Text(this.bool + "")
        .backgroundColor("#ff4798fa")
        .fontSize(30)
        .margin({ bottom: 30, top: 10 });

      // 显示存储的用户信息(对象类型)
      Text("储存的个人信息,自 User_Message 类:")
      Text(JSON.stringify(this.myUserMessage)) // 使用 JSON.stringify 显示对象内容
        .backgroundColor("#ffe3e349")
        .fontSize(30)
        .margin({ bottom: 30, top: 10 });

      // 按钮用于更改存储值
      Button("点击变换")
        .onClick(() => {
          // 每次点击年龄加1
          this.age += 1;

          // 名字追加【-GO-】
          this.name += "【-GO-】";

          // 布尔值变为 false
          this.bool = false;

          // 更新用户信息对象
          this.myUserMessage.name += "【-go-】";
          this.myUserMessage.age += 2;
          this.myUserMessage.height += 10;
        });

      // 说明点击按钮后数据的变化
      Text(` --age++ \n --name += 【-GO-】 \n --bool =false \n --对象类:名字+【-go-】,年龄+2,身高+10`);
    }
    .height("100%") // 列组件的高度设置为全屏
    .width("100%"); // 列组件的宽度设置为全屏
  }
}

2.1.3 源码1运行效果

2.1.3.1 效果视频
  • 视频效果

PersistentStorage持久化储存的基本使用

2.1.3.2 效果截图
2.1.3.2.1 默认情况下
  • 运行程序默认情况下
    在这里插入图片描述
2.1.3.2.2 点击按钮第一下
  • 点击 “点击变换” 摁钮第一下
    在这里插入图片描述
2.1.3.2.3 点击按钮第二下
  • 点击 “点击变换” 摁钮第二下
    在这里插入图片描述
2.1.3.2.4 点击按钮第三下
  • 点击 “点击变换” 摁钮第三下
    在这里插入图片描述
2.1.3.2.5 退出程序
  • 使用手机的手势,摁住页面上滑退出,或如下图点击退出
    在这里插入图片描述
2.1.3.2.6 重新进入程序
  • 点击模拟器应用重新进入程序
    在这里插入图片描述
  • 进入程序后的效果,内容还是之前点击三次以后的状态。若不使用持久化储存,每次关闭应用后再此打开应用都会为前面 默认情况下 的运行效果
    在这里插入图片描述

3.结语

持久化存储 (PersistentStorage) 为轻量级的储存方式,若想对于庞大的数据内容进行储存,还是得使用数据库的储存方式。本文关于持久化储存只是简单的逻辑结构的编写记录,目的在于我们先了解持久化储存的基本格式,以后再逐步添加复杂的用法。

持久化PersistentStorage的相关的内容,华为官方的指南地址:PersistentStorage:持久化存储UI状态

由于笔者的能力有限,创作的内容有所不足在所难免,也敬请读者包涵和指出,万分感谢!

4.定位日期

待视频审核通过;
2024-11-30;
10:48;

2024-11-30;
11:07;

<think>好的,我需要回答用户关于HarmonyOS ArkTSPersistentStorage用法和示例的问题。首先,我得回顾一下用户提供的引用内容,确保信息准确并正确引用。 用户提到了四个引用,都是关于PersistentStorage的,特别是与AppStorage的双向同步、使用方法以及限制条件。我需要把这些信息整合起来,结构清晰地解释PersistentStorage的用途、基本用法、示例代码以及注意事项。 首先,PersistentStorage的作用是持久化存储UI状态,这点在引用[^1][^2][^3][^4]中都有提到。它和AppStorage建立双向同步,所以应用通常通过AppStorage访问PersistentStorage的数据。接下来,我需要分步骤说明如何初始化属性、同步机制、数据访问和示例代码。 在基本用法部分,应该包括如何用PersistentStorage.persistProp初始化属性,比如例子中的'userScore'和'userName'。要强调这些属性会自动同步到AppStorage,并且应用重启后数据仍然存在。然后,示例代码需要展示ArkTS的组件如何使用@StorageLink装饰器来绑定这些属性,实现UI和数据的双向同步。 注意事项方面,引用中提到数据类型限制,比如只能处理boolean、string、number等简单类型,以及对象和复杂结构需要用序列化方法处理。还有属性名不能重复,否则会覆盖,这些都需要明确列出。 最后,生成相关问题时要围绕PersistentStorage的机制、限制、与其他存储方式的对比以及实际应用中的问题。比如同步机制如何工作,数据类型限制的解决方案,与AppStorage的关系,以及实际开发中的常见错误。 需要确保所有数学表达式或代码格式正确,比如使用$...$或$$...$$,但在这个问题中可能更多涉及代码块。检查引用标注是否正确,每个引用标记对应正确的来源。另外,使用中文回答,保持结构清晰,分步骤说明,让用户容易理解。</think>### HarmonyOS ArkTS PersistentStorage用法解析 #### 一、PersistentStorage核心作用 PersistentStorage是鸿蒙ArkTS中实现**持久化存储UI状态**的关键模块,其核心功能是与AppStorage建立**双向数据同步**。应用重启后仍能保留指定属性值,例如用户登录状态$userToken$、应用配置$appConfig$等[^1]。 #### 二、基础用法四步走 1. **初始化持久化属性** 使用`PersistentStorage.persistProp()`预定义需持久化的属性: ```typescript PersistentStorage.persistProp('userScore', 95); // 数值型默认值 PersistentStorage.persistProp('userName', 'Anonymous'); // 字符串型默认值 ``` 2. **自动同步机制** 通过`@StorageLink`装饰器建立UI组件与AppStorage的绑定: ```typescript @Entry @Component struct ProfilePage { @StorageLink('userScore') score: number = 0 @StorageLink('userName') name: string = '' build() { Column() { Text(`Score: ${this.score}`) // 显示持久化数值 TextInput({ text: this.name }) // 输入框双向绑定 .onChange((val) => { this.name = val }) } } } ``` 3. **数据访问路径** ```mermaid graph LR UI组件 -->|@StorageLink| AppStorage --> PersistentStorage --> 本地存储文件 ``` 4. **运行效果验证** 修改`userName`字段后杀死应用,重启时输入框会自动载入上次输入值。可通过DevEco Studio的**Database Inspector**工具直接查看SQLite数据库内容验证存储结果。 #### 三、关键限制条件 1. **数据类型限制** 支持`boolean`、`string`、`number`等基础类型,复杂对象需通过`JSON.stringify()`序列化: ```typescript const settings = { theme: 'dark', fontSize: 16 }; PersistentStorage.persistProp('appSettings', JSON.stringify(settings)); ``` 2. **命名冲突规避** 属性名全局唯一,重复调用`persistProp('aProp')`会导致值覆盖。建议采用**命名空间前缀**: ```typescript PersistentStorage.persistProp('UserProfile.avatarUrl', 'default.jpg'); ``` 3. **容量上限** 单应用默认存储上限为$2^{16}$字节(约64KB),超限需使用分布式数据管理模块[^4]。 #### 四、典型应用场景 1. 用户偏好设置(主题/语言) 2. 表单草稿自动保存 3. 游戏进度存档 4. 离线缓存关键数据 ```typescript // 完整示例:主题切换持久化 PersistentStorage.persistProp('isDarkMode', false); @Entry @Component struct SettingsPage { @StorageLink('isDarkMode') darkMode: boolean = false build() { Column() { Toggle({ type: ToggleType.Switch, isOn: this.darkMode }) .onChange((isOn) => { this.darkMode = isOn }) } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值