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 相关文章推荐
拖动布局之保存布局页面cookies篇
Oct 29 Javascript
瀑布流布局代码一例
Apr 11 Javascript
js中最容易被忽视的事件问题大总结
May 15 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
微信小程序中使用javascript 回调函数
May 11 Javascript
浅谈Vue内置component组件的应用场景
Mar 27 Javascript
Node.js的Koa实现JWT用户认证方法
May 05 Javascript
教你使用vue-cli快速构建的小说阅读器
May 13 Javascript
原生js实现抽奖小游戏
Jun 27 Javascript
浅谈vue3中effect与computed的亲密关系
Oct 10 Javascript
vue的路由映射问题及解决方案
Oct 14 Javascript
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
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 header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
使用php实现截取指定长度
2013/08/06 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
2019/05/29 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
React 组件间的通信示例
2018/06/14 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
Python跳出循环语句continue与break的区别
2014/08/25 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
EJB面试题
2015/07/28 面试题
环境工程毕业生自荐信
2013/11/17 职场文书
通用求职信范文模板分享
2013/12/27 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
药剂专业自荐书
2014/06/20 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
Nginx域名转发使用场景代码实例
2021/03/31 Servers
在js中修改html body的样式
2021/11/11 Javascript