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的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
javascript一些实用技巧小结
Mar 18 Javascript
学习js在线html(富文本,所见即所得)编辑器
Dec 18 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 Javascript
javascript初学者常用技巧
Sep 02 Javascript
js中style.display=""无效的解决方法
Oct 30 Javascript
JavaScript对象参数的引用传递
Jan 14 Javascript
[原创]jQuery常用的4种加载方式分析
Jul 25 Javascript
快速解决vue在ios端下点击响应延时的问题
Aug 27 Javascript
小程序getLocation需要在app.json中声明permission字段
Apr 04 Javascript
js实现浏览器打印功能的示例代码
Jul 15 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 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数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
2010/05/15 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
python单线程实现多个定时器示例
2014/03/30 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
会计自我鉴定
2013/11/02 职场文书
儿媳婚宴答谢词
2014/01/14 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
文秘个人求职信范文
2014/04/22 职场文书
警示教育活动总结
2014/05/05 职场文书
整改落实自查报告
2014/11/05 职场文书
2014年保管员工作总结
2014/11/18 职场文书
2014年个人年终总结
2015/03/09 职场文书
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python