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求对象的高宽问题分别说明
Aug 30 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
Feb 12 Javascript
JS基于面向对象实现的拖拽功能示例
Dec 20 Javascript
JavaScript中 DOM操作方法小结
Apr 25 Javascript
Vue如何实现组件的源码解析
Jun 08 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
Nov 22 Javascript
详解Vue中watch的详细用法
Nov 28 Javascript
vue全局自定义指令-元素拖拽的实现代码
Apr 14 Javascript
Vue使用lodop实现打印小结
Jul 06 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
Oct 21 Javascript
如何基于viewport vm适配移动端页面
Nov 13 Javascript
js加减乘除精确运算方法实例代码
Jan 17 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
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
针对初学PHP者的疑难问答(2)
2006/10/09 PHP
PHP新手上路(十)
2006/10/09 PHP
php中执行系统命令的方法
2015/03/21 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
Javascript学习笔记2 函数
2010/01/11 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
js实现车辆管理系统
2020/08/26 Javascript
python在命令行下使用google翻译(带语音)
2014/01/16 Python
python端口扫描系统实现方法
2014/11/19 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
python 读取文件并替换字段的实例
2018/07/12 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
公司向个人借款协议书范本
2014/10/09 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
学校标语口号大全
2015/12/26 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
oracle覆盖导入dmp文件的2种方法
2021/05/21 Oracle
基于JavaScript实现年月日三级联动
2021/06/22 Javascript
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server