解决vue页面刷新,数据丢失的问题


Posted in Vue.js onNovember 24, 2020

在做vue项目的过程中有时候会遇到一个问题,就是进行F5页面刷新的时候,页面的数据会丢失,出现这个问题的原因是因为当用vuex做全局状态管理的时候,store中的数据是保存在运行内存中的,页面刷新时会重新加载vue实例,store中的数据就会被重新赋值,因此数据就丢失了,解决方式如下:

解决方法一:

最先想到的应该就是利用localStorage/sessionStorage将数据储存在外部,做一个持久化储存,下面是利用localStorage存储的具体方案:

方案一:由于state中的数据是响应式的,而数据又是通过mutation来进行修改,故在通过mutation修改state中数据的同时调用localStorage.setItem()方法来进行数据的存储。

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
 state: {
  orderList: [],
  menuList: []
 },
 mutations: {
  orderList(s, d) {
   s.orderList= d;
   window.localStorage.setItem("list",JSON.stringify(s.orderList))
  }, 
  menuList(s, d) {
   s.menuList = d;
   window.localStorage.setItem("list",JSON.stringify(s.menuList))
  },
 }
})

在页面加载的时候再通过localStorage.getItem()将数据取出放回到vuex,可在app.vue的created()周期函数中写如下代码:

if (window.localStorage.getItem("list") ) {
  this.$store.replaceState(Object.assign({}, 
  this.$store.state,JSON.parse(window.localStorage.getItem("list"))))
}

方案二:方案一能够顺利解决问题,但不断触发localStorage.setItem()方法对性能不是特别友好,而且一直将数据同步到localStorage中似乎就没必要再用vuex做状态管理,直接用localStorage即可,于是对以上解决方法进行了改进,通过监听beforeunload事件来进行数据的localStorage存储,beforeunload事件在页面刷新时进行触发,具体做法是在App.vue的created()周期函数中下如下代码:

if (window.localStorage.getItem("list") ) {
  this.$store.replaceState(Object.assign({}, this.$store.state,JSON.parse(window.localStorage.getItem("list"))))
 } 

window.addEventListener("beforeunload",()=>{
  window.localStorage.setItem("list",JSON.stringify(this.$store.state))
 })

解决方法二(推荐):

这个方法是基于对computed计算属性的理解,在vue的官方文档中有这么一段话:

解决vue页面刷新,数据丢失的问题

由此得知计算属性的结果会被缓存,也就是说在有缓存的情况下,computed会优先使用缓存,于是也可以在state数据相对应的页面这样写:

computed:{
  orderList() {
    return this.$store.state.orderList
  }
}

以上就是解决vue页面刷新,数据丢失的问题的详细内容,更多关于vue页面刷新,数据丢失的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue+vant实现购物车全选和反选功能
Nov 17 Vue.js
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
Dec 02 Vue.js
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
vue实现登录功能
Dec 31 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
vue项目支付功能代码详解
Feb 18 Vue.js
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 Vue.js
vue @ ~ 相对路径 路径别名设置方式
Jun 05 Vue.js
Vue 的 v-model用法实例
Nov 23 #Vue.js
VUE+Element实现增删改查的示例源码
Nov 23 #Vue.js
Vue实现购物小球抛物线的方法实例
Nov 22 #Vue.js
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 #Vue.js
详解vue 组件注册
Nov 20 #Vue.js
vue-drawer-layout实现手势滑出菜单栏
Nov 19 #Vue.js
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 #Vue.js
You might like
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
基于JQuery 选择器使用说明介绍
2013/04/18 Javascript
js Math 对象的方法
2013/09/01 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
基于python生成器封装的协程类
2019/03/20 Python
python输入多行字符串的方法总结
2019/07/02 Python
用Python配平化学方程式的方法
2019/07/20 Python
django和vue实现数据交互的方法
2019/08/21 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
毕业实习个人鉴定范文
2013/12/10 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
新年晚会主持词
2014/03/24 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
上课不认真检讨书
2014/09/17 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
2015年物流客服工作总结
2015/07/27 职场文书