vue单页应用在页面刷新时保留状态数据的方法


Posted in Javascript onSeptember 21, 2018

在Vue单页应用中,如果在某一个具体路由的具体页面下点击刷新,那么刷新后,页面的状态信息可能就会丢失掉。这时候应该怎么处理呢?如果你也有这个疑惑,这篇文章或许能够帮助到你

一、问题

现在产品上有个需求:单页应用走到某个具体的页面,然后点击刷新后,刷新的页面要与刷新前的页面要保持一致。

这时候就需要我们保存刷新之前页面的状态。

二、一种解决方案

在这个Vue单页应用中,王二是用Vuex作为状态管理的,一开始王二的思路是将Vuex里的数据同步更新到localStorage里。

即:一改变vuex里的数据,便触发localStorage.setItem 方法,参考如下代码:

import Vue from "vue"
import Vuex from "vuex"
 
Vue.use(Vuex)
 
function storeLocalStore (state) {
  window.localStorage.setItem("userMsg",JSON.stringify(state));
}
 
export default new Vuex.Store({
  state: {
    username: "王二",
    schedulename: "标题",
    scheduleid: 0,
  },
  mutations: {
    storeUsername (state,name) {
      state.username = name
      storeLocalStore (state)
    },
    storeSchedulename (state,name) {
      state.schedulename = name
      storeLocalStore (state)
    },
    storeScheduleid (state,id) {
      state.scheduleid = Number(id)
      storeLocalStore (state)
    },
  }
})

然后在页面加载时再从localStorage里将数据取回来放到vuex里,于是王二在 App.vue 的 created 钩子函数里写下了如下代码:

localStorage.getItem("userMsg") && this.$store.replaceState(JSON.parse(localStorage.getItem("userMsg")));
 
//考虑到第一次加载项目时localStorage里没有userMsg的信息,所以在前面要先做判断

这样就能比较圆满的解决问题了。

三、另一种解决方案

以上的解决方法由于要频繁地触发 localStorage.setItem 方法,所以对性能很不友好。而且如果一直同步vuex里的数据到localStorage里,我们直接用localStorage做状态管理好了,似乎也没有必要再用vuex。

这时候王二想,如果有什么方法能够监听到页面的刷新事件,然后在那个监听方法里将Vuex里的数据储存到localStorage里,那该多好。

很幸运,还真有这样的监听事件,我们可以用 beforeunload 来达到以上目的,于是王二在 App.vue 的 created 钩子函数里写下了如下代码:

//在页面加载时读取localStorage里的状态信息
  localStorage.getItem("userMsg") && this.$store.replaceState(JSON.parse(localStorage.getItem("userMsg")));
  
  //在页面刷新时将vuex里的信息保存到localStorage里
  window.addEventListener("beforeunload",()=>{
    localStorage.setItem("userMsg",JSON.stringify(this.$store.state))
  })

这样的话,似乎就比较完美了。

2018年03月27日补充:

王二在使用上述方法时,遇到了一个问题,就是:在开发阶段,如果在Vuex里添加新的字段,则新的字段不能被保存到localStorage里,于是上述代码修改如下:

//在页面加载时读取localStorage里的状态信息
  localStorage.getItem("userMsg") && this.$store.replaceState(Object.assign(this.$store.state,JSON.parse(localStorage.getItem("userMsg"))));
  
  //在页面刷新时将vuex里的信息保存到localStorage里
  window.addEventListener("beforeunload",()=>{
    localStorage.setItem("userMsg",JSON.stringify(this.$store.state))
  })

以上这篇vue单页应用在页面刷新时保留状态数据的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
比较全的JS checkbox全选、取消全选、删除功能代码
Dec 19 Javascript
js或css实现滚动广告的几种方案
Jan 28 Javascript
JavaScript DOM学习第一章 W3C DOM简介
Feb 19 Javascript
一个JQuery写的点击上下滚动的小例子
Aug 27 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
Nov 17 Javascript
AngularJS入门教程之AngularJS 模板
Aug 18 Javascript
AngularJS 防止页面闪烁的方法
Mar 09 Javascript
js中关于Blob对象的介绍与使用
Nov 29 Javascript
原生js实现五子棋游戏
May 28 Javascript
javascript实现前端成语点击验证优化
Jun 24 Javascript
vue 防止页面加载时看到花括号的解决操作
Nov 09 Javascript
微信小程序实现天气预报功能(附源码)
Dec 10 Javascript
vue如何安装使用Quill富文本编辑器
Sep 21 #Javascript
vue中设置、获取、删除cookie的方法
Sep 21 #Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
Sep 21 #Javascript
vue富文本编辑器组件vue-quill-edit使用教程
Sep 21 #Javascript
React实现全局组件的Toast轻提示效果
Sep 21 #Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
Sep 21 #Javascript
vue 使某个组件不被 keep-alive 缓存的方法
Sep 21 #Javascript
You might like
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
js location.replace与location.reload的区别
2010/09/08 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
Python中获取网页状态码的两个方法
2014/11/03 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
python简单贪吃蛇开发
2019/01/28 Python
python调用c++传递数组的实例
2019/02/13 Python
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
Python中format()格式输出全解
2019/04/12 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Python测试模块doctest使用解析
2019/08/10 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
python Scrapy框架原理解析
2021/01/04 Python
COSETTE官网:奢华,每天
2020/03/22 全球购物