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 相关文章推荐
jQuery实现form表单reset按钮重置清空表单功能
Dec 18 Javascript
jQuery实现公告文字左右滚动的实例代码
Oct 29 Javascript
jQuery性能优化的38个建议
Mar 04 Javascript
javascript鼠标滑动评分控件完整实例
May 13 Javascript
深入学习jQuery Validate表单验证
Jan 18 Javascript
微信小程序中单位rpx和rem的使用
Dec 06 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
Mar 15 Javascript
利用vue.js插入dom节点的方法
Mar 15 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
Apr 11 jQuery
javascript实现视频弹幕效果(两个版本)
Nov 28 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 Javascript
基于vue+element实现全局loading过程详解
Jul 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速度全攻略
2006/10/09 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
vue+animation实现翻页动画
2020/06/29 Javascript
实例讲解React 组件
2020/07/07 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
python版本五子棋的实现代码
2018/12/11 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
通信专业个人自我鉴定
2013/10/21 职场文书
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
在职证明范本
2015/06/15 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB
js不常见操作运算符总结
2021/11/20 Javascript
MySQL七大JOIN的具体使用
2022/02/28 MySQL
python数字图像处理:图像简单滤波
2022/06/28 Python