Vuex数据页面刷新丢失问题解决方案
用Vue做项目开发很久了,对于vuex能用、会用,但是因为状态脱离页面和刷新丢失两个原因,一直都有种抵触,特别是一些简单的数据都是通过query或者本地存储就解决了,然而对于一些复杂内容,不可避免的还是要使用Vuex去处理(真香),但是刷新丢失的问题,的确叫人头大。最近闲下来,我们来研究下怎么干掉这个问题~
不大了解Vuex的同学,可以先去官网溜溜
由于Vuex的数据是存储在内存中的,相当于memory cache,当页面刷新的时候内存被清空重载新内容,原来的数据就丢了,为了解决这个我们可以借助浏览器的本地存储来解决,此时我们有两个选择
- localStorage 真·持久存储
- sessionStorage 会话期存储
相比之下localStorage太持久了,不主动清除都会一直在,而sessionStorage更符合Vuex会话期状态管理的设计初衷。因此下文中统一使用sessionStorage来做补充,解决问题。
有了补充对象之后,我们要做的只有两点
1、每次在mutation中set state的时候,同步的塞到sessionStorage一份
2、状态初始化的时候,从sessionStorage中读取相应内容并作为默认值(存在的话)
看起来很简单,于是第一版方案有了,
export default new Vuex.Store({
state: {
userLevel: sessionStorage.getItem('userLevel') || ''
},
mutations: {
SET_USERLEVEL(state, userLevel) {
sessionStorage.setItem('userLevel', userLevel)
state.userLevel = userLevel
}
},
modules: {
}
})
这个是解决问题了,但是每个mutation都要sessionStorage.setItem一下实在有点麻烦,而且初始化还要都getItem一遍,我很懒不想写。。。于是我们改进了第二版
const storeMaker = (state) => {
// 初始化
Object.keys(state).map((key) => {
// 判断类型获取本地存储数据
if (typeof state[key] === 'object') {
if (sessionStorage.getItem(key) && JSON.parse(sessionStorage.getItem(key))) {
state[key] = JSON.parse(sessionStorage.getItem(key))
}
} else if (typeof state[key] === 'number') {
if (sessionStorage.getItem(key) && parseInt(sessionStorage.getItem(key))) {
state[key] = parseInt(sessionStorage.getItem(key))
}
} else {
if (sessionStorage.getItem(key)) {
state[key] = sessionStorage.getItem(key)
}
}
})
// 重写set处理
return new Proxy(state, {
set: function(target, key, value) {
let temp = value
if (typeof temp === 'object') {
temp = JSON.stringify(temp)
}
sessionStorage.setItem(key, temp)
return Reflect.set(target, key, value)
}
})
}
export default new Vuex.Store({
state: storeMaker({
userLevel: ''
}),
mutations: {
SET_USERLEVEL(state, userLevel) {
state.userLevel = userLevel
}
},
modules: {
}
})
内容不多,主要定义了一个storeMaker的函数实现了两个功能
1、对传入的state初始值判断类型,并尝试从sessionStorage中读取数据替换默认值
2、通过Proxy重置state的set逻辑,添加同步保存到sessionStorage的逻辑
其实本来可以通过Proxy重置get逻辑处理取值的问题,但是由于vuex本身通过defineProperty函数重置了get逻辑,在这里使用proxy覆盖会有冲突,因此在初始化的时候直接读取sessionStorage。
同时也存在一些问题:
1、目前只处理了一级属性,二级以下属性没处理,对于初始化会有偏差。对于这点处理层级也不宜过深,因为过深的结构设计本来就并不合理,两层基本也足够了。基本处理就是对于state的每个key再去遍历一遍,如果是object(非null非数组非空对象)就重新proxy一下
2、可以尝试打包成npm包,或者写成Vuex的插件形式,方便使用
3、等等
~状态不好,先写到这,大家有兴趣一起来讨论,清清脑子再来补充~
联想到的一些点:
1、memory cache和disk cache?内存怎么清理?js垃圾回收机制?
2、SessionStorage怎么做到会话期缓存?
3、session机制怎么回事?
4、http的无状态?状态保持?客户端保持?服务端保持?
5、等等等等
发散开看看,一个地方真的能学到很多东西。。。
Vuex数据页面刷新丢失问题解决方案的更多相关文章
- 解决vuex数据页面刷新后初始化问题
在vue项目的开发中经常会用到vuex来进行数据的存储,然而在开发过程中会出现刷新后页面的vuex的state数据初始化问题!下面是我用过的解决方法 利用storage缓存来实现vuex数据的刷新问题 ...
- 使用sessionStorage解决vuex在页面刷新后数据被清除的问题
https://www.jb51.net/article/138218.htm 1.原因 2.解决方法 localStorage没有时间期限,除非将它移除,sessionStorage即会话,当浏览器 ...
- vue 使用localStorage解决vuex在页面刷新后数据被清除的问题
通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...
- 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题
通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...
- 解决vuex在页面刷新后数据丢失的问题
一.原因 js代码是运行在内存中的,代码运行时的所有变量.函数也都是保存在内存中的. 刷新页面,以前申请的内存被释放,重新加载脚本代码,变量重新赋值,所以这些数据要想存储就必须存储在外部,例如:Loc ...
- 页面刷新vuex数据消失问题解决方案
VBox持续进行中,哀家苦啊,有没有谁给个star. vuex是vue用于数据存储的,和redux充当同样的角色. 最近在VBox开发的时候遇到的问题,页面刷新或者关闭浏览器再次打开的时候数据归零.这 ...
- 页面刷新vuex数据消失问题解决方案 之 vuex中间件
之前我写了一篇用ES6 Proxy方案解决数据同步的文章 页面刷新vuex数据消失问题解决方案. 今天和同事沟通这个vuex数据还原问题,我说我的方法很奇异.聊着聊着,同事咋不用 store.sub ...
- Vuex 页面刷新后store保存的数据会丢失 取cookie值
在store.js中 export default new vuex.Store({ // 首先声明一个状态 state state:{ pcid: '', postList: [], } //更新状 ...
- vue路由传参页面刷新参数丢失问题解决方案
最近项目中涉及到跨页面传参数和后台进行数据交互,看到需求之后第一反应就是用路由传参来解决:Vue中给我们提供了三种路由传参方式,下面我们一个一个的来看一下: 方法一:params传参: this.$r ...
随机推荐
- (译文)The Linux Programming Interface:第1章(历史和标准)
1 HISTORY AND STANDARDS (译者:鱼时代 校对:fgn) Linux 是UNIX操作系统家族中的一员,在计算机出现以来,UNXI已经有很长的历史了.在这一章中的第一部分将对Un ...
- Ubuntu安装完成后设置root密码
安装完ubuntu后没有默认的root密码,如果要设置root密码需要进行如下步骤: 1 sudo passwd 2 连续输入两次新密码
- 入门angularJs笔记手记一
angularjs表达式: ng-init ng-bind ng-app ng-model输入域的值绑定到程序 ng-repeat重复一个HTML元素 自定义指令: <script> va ...
- Redis——基础数据结构
Redis提供了5种基础数据结构,分别是String,list,set,hash和zset. 1.String Redis所有的键都是String.Redis的String是动态字符串,内部结构类似J ...
- js-ES6学习笔记-Class(3)
1.Class之间可以通过extends关键字实现继承. class ColorPoint extends Point { constructor(x, y, color) { super(x, y) ...
- Echarts图表常用功能配置,Demo示例
先看下效果图: 就如上图所示,都是些常用的基本配置. Legend分页,X轴设置,Y轴设置,底部缩放条设置, 数值显示样式设置,工具箱设置,自定义工具按钮, 绑定点击事件等等.这些配置代码中都做了简单 ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 8
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 7------------------- --触发器str_trigge ...
- Android系统定制和源码开发以及源码编译(附视频)
Android系统定制配套视频: 为了把Android系统源码定制和编译的课程讲完,从准备到录制完所有的视频,一共花去了近半年的时间,前前后后各种下载源码,编译源码,系统不兼容,版本适配,虚拟机配置困 ...
- autocad视图汇报,像ppt那样汇报
在大部分场景中,工程师可以用cad进行汇报,避免去做PPT,浪费时间,ppt一般都是用一次就丢弃.而工程师对于设计的中间汇报,或三维bim汇报,评审汇报,展示汇报等,都可以直接用cad软件,方法是用视 ...
- Sql Server Express 2005提示"failed to generate a user instance of sql server "
解决方法: 修改连接字符串“Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\mydb.mdf;Integrated Security ...