解决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 表单输入框不支持focus及blur事件的解决方案
Nov 17 Vue.js
vue3.0+vue-router+element-plus初实践
Dec 02 Vue.js
vue的hash值原理也是table切换实例代码
Dec 14 Vue.js
vue+openlayers绘制省市边界线
Dec 24 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
Vue3.0 手写放大镜效果
Jul 25 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue+echarts实现多条折线图
Mar 21 Vue.js
vue打包时去掉所有的console.log
Apr 10 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中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
phplot生成图片类用法详解
2015/01/06 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
PHP加密技术的简单实现
2016/09/04 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
jquery 上下滚动广告
2009/06/17 Javascript
jQuery中的常用事件总结
2009/12/27 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
JavaScript日历实现代码
2010/09/12 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
Python中的类学习笔记
2014/09/23 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
大学生饮食连锁店创业计划书
2014/01/17 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
荆州古城导游词
2015/02/06 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python