解决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 +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 Vue.js
vue使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
vue 页面跳转的实现方式
Jan 12 Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
vue实现同时设置多个倒计时
May 20 Vue.js
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
详解Vue slot插槽
Nov 20 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
vue自定义右键菜单之全局实现
Apr 09 Vue.js
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
PHP安全配置
2006/10/09 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
小程序实现搜索框
2020/06/19 Javascript
vue 中url 链接左边的小图标更改问题
2019/12/30 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
Python实现批量下载文件
2015/05/17 Python
python 文件操作删除某行的实例
2017/09/04 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
python range实例用法分享
2020/02/06 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
民主生活会整改措施(党员)
2014/09/18 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers