【鸿蒙实战开发】记录下LocalStorage、AppStorage、PersistentStorage的持久化存储相关

前言

记录下最近适配鸿蒙用到状态存储的一些理解。

理解

虽然官方文档中将管理应用存储分为了LocalStorage(页面级)、AppStorage(应用级)、PersistentStorage(持久化存储)三种类型。
使用下来,感觉其实只要关注LocalStorage(页面级)、AppStorage(应用级)两种类型就好了,而PersistentStorage与其说是存储管理,不如说是存储标记,具体的看下问吧。

LocalStorage页面级存储

在鸿蒙中LocalStorage从概念和理解是都完全不同于 Web的 localStorage。他相当于设置了一个只作用于某个页面的存储区。
别看官方文档写了一大堆,实际上用法无外乎以下:

●声明:new LocalStorage(object) ,创建一个LocalStorage,可以设置初始内容。
●绑定到页面:在 页面的组件 上使用 @Entry(storage)进行绑定。绑定后,该页面组件、以及子组件都可使用该存储中的数据了。
●使用:

○@LocalStorageProps:单向绑定,也就是页面改变了值的内容,不会影响到 localStore 中存储数据
○@LocalStorageLink:双向绑定,也就是页面改变了值的内容,会一并影响到 localStore 中存储数据
○PS: 值得一提的是,鸿蒙中@Props 都是单向绑定,@Link 都是双向绑定。

  //初始化
 let para: Record<string, number> = { 'PropA': 47 };
 let storage: LocalStorage = new LocalStorage(para);
 
 //添加创建值
 storage.setOrCreate('PropB', new PropB(50));

 //绑定
 @Entry(storage)
 @Component
struct Co
<think>好的,我现在需要回答用户关于HarmonyOSAppStorage的使用说明及示例的问题。首先,我得回忆一下AppStorage相关知识,确保自己理解正确。 AppStorage鸿蒙系统中用于应用全局UI状态存储的机制,应该类似于其他框架中的全局状态管理工具。用户提到需要结合@StorageProp和@StorageLink装饰器使用,这应该是关键点。根据提供的引用,我需要重点介绍这两个装饰器的作用和区别。 接下来,我得组织回答的结构。用户可能需要先了解AppStorage的基本概念,然后是使用场景,接着是具体的使用方法,最后是示例代码。这样结构清晰,逐步深入。 需要注意用户提供的引用中提到,AppStoragePersistentStorage和Environment配合使用时需要注意一些事项。虽然用户主要问的是AppStorage,但可能需要简要提及这些配合使用的注意事项,不过如果没有具体信息,可能需要避免深入,以免误导。 关于示例部分,应该提供一个实际的代码示例,展示如何定义AppStorage中的属性,并在组件中使用@StorageProp和@StorageLink装饰器来绑定这些属性。需要确保代码语法正确,并解释每一步的作用。 此外,用户的问题可能还涉及到如何实现数据同步、如何持久化存储等方面,但根据引用内容,重点应放在AppStorage本身的使用,所以可能需要强调其作为全局状态存储的角色,而不是持久化细节。 最后,生成的相关问题需要围绕AppStorage的扩展使用、装饰器区别以及与其他模块的协作,这样可以帮助用户进一步探索相关知识。 现在需要检查是否有遗漏点,比如装饰器的具体用法、示例的正确性,以及是否覆盖了用户的需求。同时确保遵循了系统级指令,如正确使用LaTeX格式(虽然这个问题可能不需要数学公式),使用中文回答,结构清晰等。</think>### HarmonyOS AppStorage 使用说明及示例 #### 1. 核心概念 AppStorage鸿蒙系统中用于管理 **应用全局UI状态** 的存储机制,通过 `@StorageProp` 和 `@StorageLink` 装饰器实现组件与全局状态的双向或单向绑定[^2]。其特点包括: - **全局唯一性**:所有组件共享同一份状态数据。 - **响应式更新**:状态变化自动触发关联组件的UI刷新。 - **数据类型支持**:支持基础类型(如 `string`、`number`、`boolean`)和复杂对象。 #### 2. 装饰器功能对比 | 装饰器 | 数据流向 | 组件内修改权限 | |----------------|----------------|----------------| | `@StorageProp` | 单向(父→子) | 不可直接修改 | | `@StorageLink` | 双向(父↔子) | 可直接修改 | #### 3. 使用步骤 **步骤1:初始化全局状态** 在 `EntryAbility` 中预定义 AppStorage 的初始值: ```typescript // EntryAbility.ets AppStorage.SetOrCreate<string>('userName', 'HarmonyUser'); AppStorage.SetOrCreate<number>('fontSize', 16); ``` **步骤2:组件绑定状态** 在UI组件中通过装饰器绑定数据: ```typescript // IndexPage.ets @Entry @Component struct IndexPage { @StorageLink('userName') userName: string = ''; @StorageProp('fontSize') fontSize: number = 0; build() { Column() { Text(`用户名: ${this.userName}`) .fontSize(this.fontSize) Button('修改用户名') .onClick(() => { this.userName = 'NewUser'; // 触发全局更新 }) } } } ``` **步骤3:跨组件同步** 其他组件绑定相同键值即可自动同步: ```typescript // ProfilePage.ets @Component struct ProfilePage { @StorageLink('userName') userName: string = ''; build() { Text(`当前用户: ${this.userName}`) // 自动显示最新值 } } ``` #### 4. 持久化扩展 若需持久化存储,可通过 `PersistentStorage` 关联 AppStorage: ```typescript PersistentStorage.PersistProp('userName', 'defaultUser'); ``` 此时 `userName` 在应用重启后仍保留值[^1]。 #### 5. 注意事项 - **数据类型一致性**:需确保组件中变量类型与 AppStorage 定义一致。 - **性能优化**:避免在 AppStorage存储过大或高频更新的数据。 - **生命周期**:AppStorage 状态随应用进程终止而销毁,需持久化数据需显式配置。 §§ 相关问题§§ 1. `@StorageProp` 和 `@StorageLink` 在跨组件通信中的具体差异是什么? 2. 如何通过 AppStorage 实现深层次嵌套组件的状态共享? 3. AppStorageLocalStorage 在作用域上有何区别? : HarmonyOS NEXT - AppStorage持久化存储的协作 : HarmonyOS 官方文档 - AppStorage 核心功能解析
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值