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代码
Jul 19 Javascript
JavaScript字符串常用类使用方法汇总
Apr 14 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
Dec 03 Javascript
基于Turn.js 实现翻书效果实例解析
Jun 20 Javascript
Angular.js中$apply()和$digest()的深入理解
Oct 13 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
Apr 07 Javascript
JavaScript动态绑定详解
Sep 14 Javascript
webpack4+react多页面架构的实现
Oct 25 Javascript
微信公众号平台接口开发 菜单管理的实现
Aug 14 Javascript
vue.js实现二级菜单效果
Oct 19 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 Javascript
JavaScript中的函数式编程详解
Aug 22 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导入导出excel实例
2013/10/25 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
JQquery的一些使用心得分享
2012/08/01 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
webpack下实现动态引入文件方法
2018/02/22 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
Python 字典dict使用介绍
2014/11/30 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python中标准模块importlib详解
2017/04/16 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
高校毕业生自我鉴定
2013/10/27 职场文书
成本会计实训报告
2014/11/05 职场文书
聘任证明怎么写
2015/03/02 职场文书
护理专业自荐信范文
2015/03/06 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
详解Vue slot插槽
2021/11/20 Vue.js
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技