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实现合并两个数组并去除重复项只留一个的方法
Dec 17 Javascript
浅谈JavaScript中小数和大整数的精度丢失
May 31 Javascript
seajs学习教程之基础篇
Oct 20 Javascript
vue.js+Element实现表格里的增删改查
Jan 18 Javascript
关于foreach循环中遇到的问题小结
May 08 Javascript
webpack打包单页面如何引用的js
Jun 07 Javascript
关于layui flow loading占位图的实现方法
Sep 21 Javascript
基于Vue 撸一个指令实现拖拽功能
Oct 09 Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 Javascript
Javascript Web Worker使用过程解析
Mar 16 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
Jul 18 Javascript
基于javascript的无缝滚动动画1
Aug 07 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开发过程中关于继承的使用方法分享
2011/06/17 PHP
php获取操作系统语言代码
2013/11/04 PHP
Laravel5中contracts详解
2015/03/02 PHP
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
Vue Prop属性功能与用法实例详解
2019/02/23 Javascript
Python获取文件所在目录和文件名的方法
2017/01/12 Python
简单实现python收发邮件功能
2018/01/05 Python
python对常见数据类型的遍历解析
2019/08/27 Python
python3 mmh3安装及使用方法
2019/10/09 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
教你怎样写好自我评价
2013/10/05 职场文书
互联网创业计划书的书写步骤
2014/01/28 职场文书
《钱学森》听课反思
2014/03/01 职场文书
答谢会策划方案
2014/05/12 职场文书
保护环境倡议书100字
2014/05/19 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
公务员个人年终总结
2015/02/12 职场文书
大学生党课心得体会
2016/01/07 职场文书
AJAX学习笔记
2021/05/18 Javascript
Python 实现定积分与二重定积分的操作
2021/05/26 Python
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
Python如何让字典保持有序排列
2022/04/29 Python