解决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 26 Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
vue实现轮播图帧率播放
Jan 26 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
vue中 this.$set的使用详解
Nov 17 Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 Vue.js
解决vue中provide inject的响应式监听
Apr 19 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
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
php数组去重实例及分析
2013/11/26 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
[01:46]新英雄登场
2019/09/10 DOTA
Python实现句子翻译功能
2017/11/14 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
Python3爬虫全国地址信息
2019/01/05 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
python 使用raw socket进行TCP SYN扫描实例
2020/05/05 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
pandas参数设置的实用小技巧
2020/08/23 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
生日邀请函范文
2014/01/13 职场文书
球队口号
2014/06/18 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
2014年质量工作总结
2014/11/22 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
CSS基础详解
2021/10/16 HTML / CSS
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python