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 相关文章推荐
浅析Prototype的模板类 Template
Dec 07 Javascript
JQuery datepicker 用法详解
Dec 25 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
设置cookie指定时间失效(实例代码)
May 28 Javascript
将 vue 生成的 js 上传到七牛的实例
Jul 28 Javascript
Three.js利用性能插件stats实现性能监听的方法
Sep 25 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
Apr 25 Javascript
JavaScript数组去重算法实例小结
May 07 Javascript
浅谈Vue的响应式原理
May 30 Javascript
vue父子组件间引用之$parent、$children
May 20 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
Jul 27 Javascript
JS数组的常用方法整理
Mar 31 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之curl实现http与https请求的方法
2014/10/21 PHP
php获取远程文件大小
2015/10/20 PHP
JavaScript 拖拉缩放效果
2008/12/10 Javascript
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
Ajax基础知识详解
2017/02/17 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
js实现时间日期校验
2020/05/26 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Python实现telnet服务器的方法
2015/07/10 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
绿色出行口号
2014/06/18 职场文书
个人求职自荐信范文
2014/06/20 职场文书
总账会计岗位职责
2015/04/02 职场文书
房贷收入证明范本
2015/06/12 职场文书
机械生产实习心得体会
2016/01/22 职场文书
Win11 BitLocker 驱动器加密
2022/04/19 数码科技
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang