解决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 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
详解vue中使用transition和animation的实例代码
Dec 12 Vue.js
8个非常实用的Vue自定义指令
Dec 15 Vue.js
Vue中computed和watch有哪些区别
Dec 19 Vue.js
Vue——前端生成二维码的示例
Dec 19 Vue.js
Vue基本指令实例图文讲解
Feb 25 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
vue项目实现分页效果
Mar 24 Vue.js
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
Vue监视数据的原理详解
Feb 24 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
vue实现省市区联动 element-china-area-data插件
Apr 22 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 file_get_contents 函数超时的几种解决方法
2009/07/30 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
Python3访问并下载网页内容的方法
2015/07/28 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
巴西购物网站:Submarino
2020/01/19 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
轻化专业学生实习自我鉴定
2013/09/20 职场文书
十岁生日家长答谢词
2014/01/17 职场文书
运动会开幕式解说词
2014/02/05 职场文书
教代会开幕词
2015/01/28 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
医者仁心观后感
2015/06/17 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers