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 相关文章推荐
Highslide.js是一款基于js实现的网页中图片展示插件
Mar 30 Javascript
jquery 动态创建元素的方式介绍及应用
Apr 21 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 Javascript
JavaScript中创建字典对象(dictionary)实例
Mar 31 Javascript
基于jQuery Ajax实现上传文件
Mar 24 Javascript
AngularJS基础 ng-keypress 指令简单示例
Aug 02 Javascript
JavaScript实现瀑布流图片效果
Jun 30 Javascript
解决微信小程序防止无法回到主页的问题
Sep 28 Javascript
基于Vue-cli快速搭建项目的完整步骤
Nov 03 Javascript
Vue全局loading及错误提示的思路与实现
Aug 09 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
Aug 27 Javascript
微信公众号服务器验证Token步骤图解
Dec 30 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
PHP一些有意思的小区别
2006/12/06 PHP
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
php 数组的一个悲剧?
2011/05/11 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
2017/01/26 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
python实现的一个火车票转让信息采集器
2014/07/09 Python
python实现数组插入新元素的方法
2015/05/22 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
捐款倡议书怎么写
2014/05/13 职场文书
精神文明建设标语
2014/06/16 职场文书
个人工作表现评价材料
2014/09/21 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
社会实践活动总结格式
2015/05/11 职场文书
关于开学的感想
2015/08/10 职场文书
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers