解决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 Elenent实现表格相同数据列合并
Nov 30 Vue.js
用vue设计一个日历表
Dec 03 Vue.js
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
vue 动态生成拓扑图的示例
Jan 03 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
Vue如何清空对象
Mar 03 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
vue ant design 封装弹窗表单的使用
Jun 01 Vue.js
vue如何在data中引入图片的正确路径
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
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
JavaScript高级程序设计 事件学习笔记
2011/09/10 Javascript
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
jQuery实现导航回弹效果
2017/02/27 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python Grid使用和布局详解
2018/06/30 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
Python列表元素常见操作简单示例
2019/10/25 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
laravel使用redis队列实例讲解
2021/03/23 PHP
全神贯注教学反思
2014/02/03 职场文书
心理健康课教学反思
2014/02/13 职场文书
说明书怎么写
2014/05/06 职场文书
文明城市标语
2014/06/16 职场文书
云台山导游词
2015/02/03 职场文书
反邪教观后感
2015/06/11 职场文书
黑白记忆观后感
2015/06/18 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python