news 2026/7/6 22:22:46

vue3中持久化封装及使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
vue3中持久化封装及使用
封装js
// src/utils/storage.jsexportconstuseStorage=(key,defaultValue=null)=>{constget=()=>{try{constitem=localStorage.getItem(key);returnitem?JSON.parse(item):defaultValue;}catch(e){console.warn(`读取${key}失败`,e);returndefaultValue;}};constset=(value)=>{try{localStorage.setItem(key,JSON.stringify(value));}catch(e){console.warn(`保存${key}失败`,e);}};constremove=()=>{localStorage.removeItem(key);};return{get,set,remove};};
解读:
  1. get () 读取
    无存储值:返回传入的 defaultValue
    存储存在:返回解析后的对象 / 基础类型
    JSON 解析报错:打印警告,返回默认值
const store = useStorage('demo', { a: 1 }) console.log(store.get())
  1. set (value) 写入
    支持任意可 JSON 序列化类型:对象、数组、字符串、数字、布尔。
    注意:不能存函数、DOM、循环引用对象,会序列化报错
const infoStore = useStorage('info') infoStore.set('字符串') infoStore.set(999) infoStore.set(true) infoStore.set([1,2,3]) infoStore.set({ name: '警务平台' })
  1. remove () 删除对应 key
const tokenStore = useStorage('token') tokenStore.remove() // localStorage中token直接清除
写法1:
// 登录 token、用户信息存储<script setup>import{useStorage}from'@/utils/storage'// 1. 初始化,指定key和默认值consttokenStore=useStorage('token','')constuserStore=useStorage('userInfo',null)// 存数据:登录成功后保存token、用户信息constlogin=()=>{consttoken='abc123xyz'constuser={id:1,name:'管理员',role:'admin'}tokenStore.set(token)userStore.set(user)}// 取数据:页面初始化、接口请求时读取constgetToken=()=>{returntokenStore.get()}constgetUser=()=>{returnuserStore.get()}// 删除数据:退出登录清空constlogout=()=>{tokenStore.remove()userStore.remove()}</script>
写法2:对象解构 + 别名重命名的写法
// 解构别名写法const{get:getLayout,set:saveLayoutToStorage,remove:clearLayoutStorage}=useStorage('dashboard_layout',[]);// 使用constdata=getLayout()saveLayoutToStorage([...])clearLayoutStorage()// 多存储 key 同时解构(项目多场景)// 布局存储const{get:getLayout,set:saveLayout}=useStorage('dashboard_layout')// 侧边栏状态存储const{get:getSidebar,set:saveSidebar}=useStorage('sidebar_collapse',false)// token存储const{get:getToken,set:setToken,remove:logoutClearToken}=useStorage('token','')
写法对比
  • 简单状态(token、主题色)推荐写法 1;
  • 复杂业务数据(拖拽布局、筛选表单、多字段配置)推荐你这种解构别名写法,可读性更高。
// 写法1:直接接收实例(简洁,通用)constlayoutStore=useStorage('dashboard_layout',[])layoutStore.get()layoutStore.set(data)// 写法2:解构别名(语义化,适合复杂业务)const{get:getLayout,set:saveLayoutToStorage}=useStorage('dashboard_layout',[])getLayout()saveLayoutToStorage(data)
常见业务实战案例
示例 1:登录 / 退出完整流程
<script setup>import{useStorage}from'@/utils/storage'consttokenStore=useStorage('token','')constuserStore=useStorage('user',null)// 登录consthandleLogin=async()=>{constres=awaitapi.login(form)tokenStore.set(res.data.token)userStore.set(res.data.user)}// 退出consthandleLogout=()=>{tokenStore.remove()userStore.remove()router.push('/login')}// 页面初始化读取用户constuser=userStore.get()</script>
示例 2:保存页面筛选条件(刷新页面不丢失)
<script setup>import{useStorage}from'@/utils/storage'// 默认筛选条件constfilterStore=useStorage('portalFilter',{name:'',type:'all'})// 页面加载读取筛选条件回填表单constfilterParams=filterStore.get()// 查询时保存筛选条件constsearch=()=>{filterStore.set(filterParams)// 请求接口...}// 重置清空存储constreset=()=>{filterStore.remove()}</script>
注意事项 & 踩坑点
  1. 每次调用 useStorage(key) 会生成全新实例
    不要重复创建实例操作同一个 key,建议提前定义变量复用:
// 不推荐(重复实例)useStorage('token').set('xxx')useStorage('token').get()// 推荐(复用实例)consttokenStore=useStorage('token')tokenStore.set('xxx')tokenStore.get()
  1. localStorage 同步阻塞,大量数据读写不建议频繁调用
  2. 存储大数据超出容量会触发 set 内 catch 警告,不会报错崩溃
  3. 默认值仅在读取失败 / 无数据时生效,不会自动写入本地
  4. 仅存储到当前域名,无痕模式关闭浏览器数据会清空
  5. 不支持响应式:get() 获取的值是静态副本,本地存储变更不会自动更新页面变量
    如果需要响应式,可封装一层 ref,如下:
<script setup>import{ref}from'vue'import{useStorage}from'@/utils/storage'constuserStore=useStorage('user',null)constuser=ref(userStore.get())constupdateUser=(newVal)=>{userStore.set(newVal)user.value=newVal// 手动更新响应式变量}</script>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 8:36:16

生产 Agent 接私有数据前,先补 6 个数据接入边界

生产 Agent 接私有数据前&#xff0c;先补 6 个数据接入边界 这两周国内关于 Agent、MCP、Codex、Claude Code 的讨论还在升温&#xff0c;但一旦系统准备接入企业内部知识库、CRM、工单、支付、设备台账或运行日志&#xff0c;问题就不再只是“检索效果够不够好”。 真正决定这…

作者头像 李华
网站建设 2026/7/2 7:22:37

深度学习调优实战:batch_size与学习率warm-up的协同策略

1. 为什么batch_size与学习率warm-up需要协同工作 我第一次训练ResNet-50时&#xff0c;batch_size直接设为256&#xff0c;学习率固定为0.1&#xff0c;结果模型在前几个epoch就崩了。后来发现&#xff0c;batch_size和学习率的关系就像油门和离合——踩得太猛容易熄火。batc…

作者头像 李华
网站建设 2026/7/3 15:26:53

2025年8月一区SCI-星球死亡优化算法Star Death-附Matlab免费代码

引言 近年来&#xff0c;在合理框架内求解优化问题的元启发式算法的发展引起了全球科学界的极大关注。本期介绍一种新的创新算法——星球死亡优化算法Star Death,SD。该算法从恒星死亡的物理过程中得到启发&#xff0c;提出一种新的轻量级元启发式算法。旨在建立精确、规则和最…

作者头像 李华
网站建设 2026/7/3 12:07:02

终极指南:如何安全本地化导出浏览器Cookie的3种格式

终极指南&#xff1a;如何安全本地化导出浏览器Cookie的3种格式 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 在Web开发和自动化测试中&#xff…

作者头像 李华
网站建设 2026/7/3 0:57:43

EPICS实战:手把手搭建工业电机控制原型系统

1. EPICS与工业电机控制入门指南 第一次接触EPICS和工业电机控制的朋友可能会觉得这个领域门槛很高&#xff0c;但其实只要跟着步骤一步步来&#xff0c;完全可以快速上手。EPICS&#xff08;Experimental Physics and Industrial Control System&#xff09;是一套开源的分布式…

作者头像 李华
网站建设 2026/7/3 19:31:36

反向新兴交叉领域:影像预测组学

要点 随着病理全切片图像等临床影像数据的日益普及&#xff0c;利用影像数据直接推演分子组学信息的研究需求持续增长。 现有综述已覆盖影像-组学数据融合、特定癌种中基于影像的生物标志物预测等方向&#xff0c;本文首次对影像直接推演组学的预测框架进行了系统综述。 本文…

作者头像 李华