当前位置: 首页 > web >正文

Vue基础知识-localStorage 与 sessionStorage

一、完整实战代码

以下代码包含 localStorage 和 sessionStorage 的保存、读取、删除、清空全流程操作,支持字符串和对象存储(解决 Web Storage 仅存字符串的限制):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- F12点击应用选项查看localStorage,sessionStorage。存储大小一般为5MBlocalStorage:1 localStorage不能跨浏览器访问2 数据会永久保存,关闭浏览器再打开仍然可以访问。用户可以清空浏览器缓存来清理3 同一域名下所有标签页 / 窗口共享sessionStorage:1 sessionStorage不能跨浏览器访问2 关闭浏览器,数据消失3 仅当前标签页 / 窗口独立(不同标签页不共享)--><input type="button" onclick="saveData()" value="保存数据到localStorage"/><input type="button" onclick="getData()" value="读取localStorage中的数据"/><input type="button" onclick="delData()" value="删除localStorage中的数据"/><input type="button" onclick="clearData()" value="清空localStorage中的数据"/><hr><input type="button" onclick="saveData2()" value="保存数据到sessionStorage"/><input type="button" onclick="getData2()" value="读取sessionStorage中的数据"/><input type="button" onclick="delData2()" value="删除sessionStorage中的数据"/><input type="button" onclick="clearData2()" value="清空sessionStorage中的数据"/>
</body>
<script>function saveData(){localStorage.setItem('msg','hello')//覆盖localStorage.setItem('msg','hello!')//对象转jsonlocalStorage.setItem('person',JSON.stringify({name:'张三',age:18}))}function getData(){console.log(localStorage.getItem('msg'))console.log(JSON.parse(localStorage.getItem('person')))//json转对象}function delData(){localStorage.removeItem('msg')localStorage.removeItem('person')}function clearData(){localStorage.clear()}
</script>
<script>function saveData2(){sessionStorage.setItem('msg','hello')//覆盖sessionStorage.setItem('msg','hello!')//对象转jsonsessionStorage.setItem('person',JSON.stringify({name:'张三',age:18}))}function getData2(){console.log(sessionStorage.getItem('msg'))console.log(JSON.parse(sessionStorage.getItem('person')))//json转对象}function delData2(){sessionStorage.removeItem('msg')sessionStorage.removeItem('person')}function clearData2(){sessionStorage.clear()}
</script>
</html>

二、Web Storage 核心 API 解析

localStorage 和 sessionStorage 共享完全相同的 API 方法,核心是键值对(Key-Value)操作,且仅支持存储字符串类型(对象需通过 JSON 转换)。

API 方法作用参数说明返回值
setItem(key, value)存储键值对key:字符串(唯一标识);value:字符串无返回值
getItem(key)根据键读取对应值key:需读取的键名成功返回字符串,失败返回 null
removeItem(key)根据键删除指定键值对key:需删除的键名无返回值
clear()清空当前存储对象的所有键值对无参数无返回值
key(index)根据索引获取对应键名(较少用)index:数字(0 开始的索引)返回对应索引的键名

关键注意点:

  1. 数据类型限制:Web Storage 仅支持字符串存储,若要存储对象 / 数组,需用 JSON.stringify() 转为字符串,读取时用 JSON.parse() 解析回原类型。
  2. 键名覆盖:若存储相同键名的新值,旧值会被覆盖(如代码中 localStorage.setItem('msg', ...) 两次调用)。
  3. null 处理:若键不存在,getItem(key) 会返回 null,直接对 null 用 JSON.parse() 会报错,需加判断(如代码中 userStr ? JSON.parse(userStr) : null)。

三、localStorage 与 sessionStorage 核心差异

两者用法完全一致,但生命周期、作用范围有本质区别,这是选择使用的核心依据。

对比维度localStoragesessionStorage
生命周期永久存储(除非手动删除或清除浏览器缓存)会话存储(关闭标签页 / 浏览器后自动删除)
作用范围同一域名下所有标签页 / 窗口共享仅当前标签页 / 窗口独立(不同标签页不共享)
存储大小约 5MB(各浏览器略有差异)约 5MB(与 localStorage 一致)
跨浏览器访问不支持(Chrome 存储的数据,Firefox 无法读取)不支持(同 localStorage)
刷新页面数据保留数据保留(仅关闭标签页 / 浏览器才丢失)

直观示例:

  • 用 localStorage 存数据后,打开同一域名的新标签页,仍能读取到数据;
  • 用 sessionStorage 存数据后,打开新标签页读取,会返回 null(不同标签页独立)。

四、实际开发场景

1. localStorage 适用场景

适合存储长期有效、跨页面共享的数据:

  • 用户偏好设置:如主题颜色(深色 / 浅色)、字体大小、语言选择;
  • 登录状态(非敏感):如 “记住我” 功能(存储非敏感的 Token 或用户 ID,注意:敏感信息需加密);
  • 本地缓存:如接口返回的静态数据(商品分类、地区列表),减少重复请求。

示例代码(存储用户主题)

// 保存主题设置
localStorage.setItem('theme', 'dark');// 页面加载时读取主题
window.onload = () => {const theme = localStorage.getItem('theme') || 'light';document.body.className = theme; // 应用主题
};

2. sessionStorage 适用场景

适合存储临时有效、仅当前会话使用的数据:

  • 临时表单内容:如用户填写一半的表单(防止刷新页面丢失);
  • 会话级 Token:如临时登录凭证(关闭页面后无需保留);
  • 页面间临时传递数据:如从列表页跳转到详情页,传递临时参数(无需永久存储)。

示例代码(临时保存表单)

// 监听表单输入,实时保存到 sessionStorage
const form = document.querySelector('#myForm');
form.addEventListener('input', (e) => {const formData = {username: form.username.value,email: form.email.value};sessionStorage.setItem('tempFormData', JSON.stringify(formData));
});// 页面加载时恢复表单
window.onload = () => {const tempData = sessionStorage.getItem('tempFormData');if (tempData) {const formData = JSON.parse(tempData);form.username.value = formData.username;form.email.value = formData.email;}
};

五、注意事项

1. 存储大小限制

  • 单个域名下 Web Storage 总大小约 5MB,超过会抛出 QuotaExceededError 错误;
  • 避免存储大量数据(如 base64 图片),建议仅存少量配置、临时参数。

2. 安全性问题

  • 不存储敏感信息:Web Storage 存储的是明文数据,任何人可通过 F12 查看 / 修改,严禁存储密码、银行卡号等敏感信息;
  • 敏感数据加密:若需存储 Token 等非极敏感信息,建议先通过简单加密(如 Base64 或自定义算法)再存储。

3. 浏览器兼容性

  • 支持所有现代浏览器(Chrome、Firefox、Edge、Safari),以及 IE 8+;
  • 若需兼容更老浏览器(如 IE7-),需用 Cookie 替代(但 Cookie 仅 4KB 大小,且每次请求会携带)。

4. 数据持久化风险

  • localStorage 数据会被用户手动清除(如浏览器 “清除浏览数据” 功能),需做好数据丢失后的降级处理;
  • 不同浏览器的隐私模式可能限制 Web Storage 使用(如 Safari 隐私模式下 localStorage 会失效),需加异常捕获。

六、总结

  • 若数据需长期保留、跨页面共享 → 用 localStorage
  • 若数据仅当前会话使用、关闭页面即丢 → 用 sessionStorage
http://www.xdnf.cn/news/19791.html

相关文章:

  • 华为HCIE认证:三年有效期值不值得?
  • 苹果开发中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么关系以及逻辑?优雅草卓伊凡
  • 一款开源的CMS系统简介
  • 告别侵权风险!4家优质商用音乐平台盘点,本土创作者首选推荐!
  • 使用Java获取本地PDF文件并解析数据
  • 深度优先 一直往一个方向走,可用递归或者栈实现
  • 点燃汽车电子与高端制造的“合规·高效·智能”引擎—— 全星研发项目管理软件系统APQP软件系统
  • vim中常见操作及命令
  • 浏览器内存 (JavaScript运行时内存)存储的优劣分析
  • 常见机械机构的图graph表示
  • LeetCode 844.比较含退格的字符串
  • Redis的删除策略:内存满了,谁先走?
  • 自从不小心踢了一脚主机之后,电脑频繁蓝屏、死机、无法开机……
  • vscode无法复制terminal信息
  • TypeScript Awaited:一招搞定异步函数返回值类型
  • 【JavaScript】读取商品页面中的结构化数据(JSON-LD),在不改动服务端情况下,实现一对一跳转
  • Nano Banana 复刻分镜,多图结合片刻生成想要的视频
  • 年轻教师开学焦虑破解:从心出发,重构健康工作生活新秩序
  • Unity核心概率④:MonoBehavior
  • RAGFlow——知识库检索系统开发实战指南(包含聊天和Agent模式)
  • 硬件板级设计笔试题目-基础篇-卷8
  • 纯前端html英文字帖图片生成器自动段落和换行
  • 人体姿态估计与动作分类研究报告
  • 文字识别接口-文字识别技术-ocr api
  • Corrosion: 1靶场渗透
  • 职业院校汽车专业数字化课程资源包——虚拟仿真实训资源建设方案
  • 解密llama.cpp CUDA后端:512 token大模型批处理的异步流水线架构
  • Redis 的压缩列表:像快递驿站 “紧凑货架“ 一样的内存优化结构
  • Web3 开发者周刊 65 | DAT的崛起
  • 相较于传统AR矿物鉴定有哪些优势?