解决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编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
Vue实现简单购物车功能
Dec 13 Vue.js
vue中实现点击空白区域关闭弹窗的两种方法
Dec 30 Vue.js
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
vue穿梭框实现上下移动
Jan 29 Vue.js
Vue接口封装的完整步骤记录
May 14 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 Vue.js
详解Vue项目的打包方式(生成dist文件)
Jan 18 Vue.js
三种方式清除vue路由跳转router-link的历史记录
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
编译问题
2006/10/09 PHP
用PHP实现文件上传二法
2006/10/09 PHP
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php url路由入门实例
2014/04/23 PHP
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
js实现表格筛选功能
2017/01/18 Javascript
Vue.js用法详解
2017/11/13 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
python3 flask实现文件上传功能
2020/03/20 Python
Python 支付整合开发包的实现
2019/01/23 Python
pytorch 模型可视化的例子
2019/08/17 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
生产车间实习自我鉴定
2013/09/23 职场文书
体育教育专业自荐信范文
2013/12/20 职场文书
运动会通讯稿50字
2014/01/30 职场文书
中文师范生自荐信
2014/01/30 职场文书
2015年班组工作总结
2015/04/20 职场文书
雷锋观后感
2015/06/10 职场文书
护士心得体会范文
2016/01/25 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL
Python作用域和名称空间的详细介绍
2022/04/13 Python