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 相关文章推荐
javascript 表单验证常见正则
Sep 28 Javascript
js Function类型
Dec 04 Javascript
JS实现在状态栏显示打字效果完整实例
Nov 02 Javascript
Bootstrap每天必学之表格
Nov 23 Javascript
浅析jQuery Ajax通用js封装
Jun 22 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
Oct 10 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
原生javascript实现分页效果
Apr 21 Javascript
详解vue slot插槽的使用方法
Jun 13 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 Javascript
javascript绘制简单钟表效果
Apr 07 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
Apr 26 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
PHP中cookies使用指南
2007/03/16 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
Python开发的HTTP库requests详解
2017/08/29 Python
教你学会使用Python正则表达式
2017/09/07 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
python进行两个表格对比的方法
2018/06/27 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
python空元组在all中返回结果详解
2020/12/15 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
工作的心得体会
2013/12/31 职场文书
销售人员获奖感言
2014/02/05 职场文书
水利水电专业自荐信
2014/07/08 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
公司授权委托书样本
2014/09/15 职场文书
党员对照检查材料
2014/09/22 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
Python实现8种常用抽样方法
2021/06/27 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python