HarmonyOS之LocalStorage - 详解

news/2025/10/2 22:36:33/文章来源:https://www.cnblogs.com/lxjshuju/p/19124110

一、什么是 HarmonyOS 的 LocalStorage?

✅ 基本概念

在 HarmonyOS(ArkTS)中,LocalStorage 是一种轻量级的 页面级状态管理机制,用于在页面内部及其组件之间共享状态数据,并实现响应式 UI 更新。

它是一种 “状态存储”机制,而非传统的“本地数据持久化”机制(例如文件、数据库或磁盘缓存)。其数据 存在于内存中,在页面销毁后自动释放,不会自动写入磁盘。


二、LocalStorage 的设计定位

维度定位描述
使用场景页面内共享状态(例如多个组件共享一个状态)
生命周期生命周期绑定到页面或组件树,页面销毁则数据销毁
数据存储方式内存存储,不持久化,不跨页面或应用
响应式特性支持响应式绑定,数据更新自动触发界面刷新
组件通信模式通过装饰器实现组件间的状态绑定与同步
和 AppStorage 区别LocalStorage 是页面级,AppStorage 是应用级,全局共享状态(适合设置项、主题等)
和 PersistentStorage 区别PersistentStorage 是可持久化存储,会将数据保存到本地设备磁盘中

三、LocalStorage 的核心功能

✅ 1. 键值对存储结构

const storage = new LocalStorage({
key1: value1,
key2: value2,
});
  • 通过 key 访问数据;
  • 类型必须与初始化时保持一致(比如 count 初始化为数字,就不能再赋字符串);

✅ 2. 响应式 UI 联动

通过框架提供的装饰器(如 @LocalStorageProp, @LocalStorageLink),将状态字段与组件变量绑定,实现 状态变更 → UI 自动刷新

✅ 3. 单向 / 双向绑定

装饰器说明
@LocalStorageProp单向绑定。仅在状态变化时更新字段,不会写回 storage
@LocalStorageLink双向绑定。字段变化会同步写回 storage,同时监听状态变化

✅ 4. 支持跨组件访问(但不支持跨页面)

  • 同一个页面内,所有子组件都可以访问同一个 LocalStorage 实例;
  • 不同页面之间默认无法共享 LocalStorage(可通过 AppStorage 实现共享);

四、使用方式详解

以下为 HarmonyOS ArkTS 中 标准的 LocalStorage 使用流程


✅ 步骤 1:创建 LocalStorage 实例

在页面入口组件中创建 LocalStorage,并定义初始化数据:

const localStorage = new LocalStorage({
count: 0,
username: 'guest',
});

✅ 步骤 2:注入 LocalStorage 到页面

使用 @Entry(localStorage) 装饰页面组件,让 LocalStorage 注入整个组件树:

@Entry(localStorage)
@Component
struct HomePage {
// ...
}

:注入后,页面内部所有子组件都可以通过装饰器访问 localStorage 中的状态。


✅ 步骤 3:在组件中使用装饰器绑定状态

@Component
struct CounterComponent {
// 单向绑定 count(只读)
@LocalStorageProp('count')
readonly count: number = 0;
// 双向绑定 username(可读写)
@LocalStorageLink('username')
username: string = '';
build() {
Column() {
Text(`当前计数:${this.count}`)
Text(`用户名:${this.username}`)
Button("切换用户").onClick(() => {
this.username = this.username === 'guest' ? 'admin' : 'guest';
});
}
}
}

✅ 步骤 4:修改状态自动刷新 UI

@Entry(localStorage)
@Component
struct HomePage {
@LocalStorageLink('count')
count: number = 0;
build() {
Column() {
Text(`点击次数:${this.count}`)
Button("点我加一").onClick(() => {
this.count += 1;
})
CounterComponent()
}
}
}

运行结果:

  • 每次点击按钮,count +1;
  • 因为是响应式绑定,CounterComponent 中显示的 count 会自动更新,无需手动刷新。

五、完整示例代码

✅ 场景:在主页面中管理 countusername 状态,所有子组件共享状态

// step 1:创建 LocalStorage
const localStorage = new LocalStorage({
count: 0,
username: 'guest'
});
// step 2:页面入口注入
@Entry(localStorage)
@Component
struct HomePage {
@LocalStorageLink('count')
count: number = 0;
@LocalStorageLink('username')
username: string = '';
build() {
Column() {
Text(`欢迎用户:${this.username}`)
.fontSize(20)
.fontWeight(FontWeight.Bold)
Button("修改用户名").onClick(() => {
this.username = this.username === 'guest' ? 'Alice' : 'guest';
})
Button("前往详情页").onClick(() => {
router.pushUrl('pages/DetailPage');
})
CounterComponent()
}
}
}
// 子组件:CounterComponent
@Component
struct CounterComponent {
@LocalStorageLink('count')
count: number = 0;
build() {
Column() {
Text(`计数器:${this.count}`)
Button("增加计数").onClick(() => {
this.count += 1;
});
}
}
}

六、LocalStorage 与其他存储方案对比

功能 / 特性LocalStorageAppStoragePersistentStorage
作用范围页面级应用级(全局)全局(可持久化)
是否可响应更新✅ 是✅ 是✅ 是
是否持久化❌ 否❌ 否(需配合持久化)✅ 是(写入本地磁盘)
生命周期页面存活期应用存活期永久存储
是否支持组件共享状态✅ 是✅ 是✅(需通过接口调用)
是否支持自动绑定 UI✅ 是✅ 是❌ 否(需手动刷新)
用途建议页面内部组件通信全局设置、主题登录信息、配置文件

七、使用建议

建议事项内容说明
✅ 使用 LocalStorage 管理页面级状态,如表单输入、局部交互状态等
✅ 使用装饰器简化状态绑定,避免 props 层层传递
✅ 避免在组件之间通过 props 显式传递 LocalStorage,使用 @Entry() 注入
✅ 若需跨页面共享状态,考虑将数据提升至 AppStorage 或全局管理模块
❌ 不建议用 LocalStorage 存储敏感数据或大对象
❌ 不建议使用 LocalStorage 替代数据库或持久化方案

八、总结

项目内容
技术名称LocalStorage
所属体系ArkTS(HarmonyOS ArkUI 状态管理)
用途页面内组件共享状态,响应式 UI 联动
核心装饰器@LocalStorageProp, @LocalStorageLink
生命周期页面存活期间有效
是否持久化
是否响应式
推荐使用场景表单共享、输入状态、临时配置等
不适用场景大数据存储、持久化需求、用户登录凭据等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

南华 NHXJ-02 汽车悬架检验台:实用的技术特性与实操应用指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

建设银行网站理财产品安徽房地产网站建设

pack://application:, pack://application:, 是一个在 WPF (Windows Presentation Foundation) 应用程序中用于指定资源位置的 URI (统一资源标识符) 方案的特定格式。这个格式用于访问嵌入在应用程序程序集(assemblies)中的资源,如图像、XA…

网站建设后如何修改wordpress 投稿 标签

28-实现 strStr()(easy) 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 思路…

网站重定向淮北公司做网站

一、对插槽的理解 1.定义及作用: 插槽是一种用于在组件中插入内容的特殊语法。它的作用是让父组件可以向子组件传递内容,从而实现组件的灵活性和复用性。 2.分类: 插槽可以分为具名插槽和作用域插槽。 2.1具名插槽: 具名插槽允许父…

怎么做网站注册登入页面成都网站建设公

统一配置管理中心:TranslationChain 架构的简洁配置管理方案 1. 集中式配置文件设计 config/settings.yaml: # 多环境配置开关 env: production # development|test|production# 模型管理中心 models:openai:class: langchain_openai.ChatOpenAIparams

Spring Boot Logback:实现定时任务日志与业务日志隔离 - Higurashi

1. 问题背景 在 Spring Boot 应用中,我们通常使用@EnableScheduling启用定时任务。这些定时任务在执行过程中,可能会调用 Mapper 方法与数据库交互,产生大量的 SQL 日志。默认情况下,这些日志会与普通业务请求的日…

网络流 最小割 Dinic算法

标准模板 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=210,M=5e3+10; int n,m,s,t,d[N],cur[N],vis[N]; int h[N],e[M<<1],ne[M<<1],id=1;//从2,3开始配对 LL…

15.VLANIF(2025年9月30日) - 教程

15.VLANIF(2025年9月30日) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

国庆集训DAY2

国庆集训DAY2T1 cycle思路 直接暴力\(dfs\) 解法 \(dfs\)限制\(a_i \neq a_{i-1}\) 最后判断\(a_n \neq a_{1}\) 归纳总结解题策略 \(dfs\) 结果 100pts 时间分配 20minT2 factor思路 直接暴力\(dfs\) 解法 直接暴力\(…

树莓派搭建NAS之一:安装系统

准备工作 先提前准备好需要的材料树莓派3B以上版本 16GB+ 内存卡(内存卡速率最好高一些,不然系统容易卡顿) 内存卡读卡器 树莓派镜像烧录器 网线/无线网烧录系统 1、下载并安装 Raspberry Pi Imager 前往 Raspberry…

详细介绍:电子电气架构 --- 中国汽车座舱产品与技术发展趋势展望

详细介绍:电子电气架构 --- 中国汽车座舱产品与技术发展趋势展望pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

新手Markdown学习

Markdown 学习 标题 三级标题 四级标题 +空格+标题名称 几个#代表几级标题(最多六级) 字体 Hello,world!(头尾+**) Hello,world!(头尾+*) Hello,world!(头尾+***) Hello,world!(头尾+~~) 引用好好学习,天天…

马云归来,“新零售”不死 - 指南

马云归来,“新零售”不死 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

网站关键词如何选取用织梦做网站需不需授权

FROM Dockerfile中的第一个指令&#xff0c;也是一个必须的指令。它用于指定构建新镜像时所基于的基础镜像。 FROM <image>:<tag> FROM nginx:1.25.1-alpineRUN 指令在Dockerfile中可以出现多次&#xff0c;并且每个RUN指令都会创建一个新的镜像层。为了减少镜像…

银川网站开发公司电话怎么建立自己的小程序

1.更改图像大小 通常情况下&#xff0c;如果我们想在某些上传图片&#xff0c;会发现我们的图片可能会过大或者过小&#xff0c;为此&#xff0c;我们需要调整图像的大小&#xff0c;使之符合网站的规则。 首先打开photoshop&#xff0c;打开一张图片。首先我们需要了解这张图…

SQL正则表达式总结 - 实践

SQL正则表达式总结 - 实践2025-10-02 22:13 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

Pdfminer-Vulnerability-Research

Pdfminer code auditing and script development script path: https://github.com/L1nq0/Pdfminer-CMap-Generator CMapDB Deserialization cmapdb.py#CMapDB._load_data 调用 pickle.loads_load_data 传入参数 name…

从事网站建泰安网站建设公司带

目录 一、界面演示 二、设备列表 三、抖动单元格 四、设备模型 五、设备编辑 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.htm…

营口工程建设信息网站wordpress frame

二进制是一种数制&#xff0c;也称为基数为2的数制。在二进制系统中&#xff0c;数值使用0和1这两个数字来表示。每一位二进制数字称为一个比特&#xff08;bit&#xff09;&#xff0c;是计算机中最基本的信息单位。多个比特组合在一起可以表示更大的数值或数据。 在计算机科…