Vue页面刷新记住页面状态的实现


Posted in Javascript onDecember 27, 2019

环境

vue项目,页面有搜索、筛选项等。

需求

页面跳转,切换或者刷新,希望可以记住用户在页面的筛选状态

方案v1

vue有提供一种缓存组件的解决方案 — keep-alive。
缓存不活动的组件实例,而不是销毁它们。

<keep-alive>
   <router-view v-if="$route.meta.keepAlive" class="app-middle-content"/>
  </keep-alive>
  <router-view v-if="!$route.meta.keepAlive" class="app-middle-content"/>

我们可以使用keep-alive包括路由组件,去缓存页面状态。

但是,这样并不能满足刷新页面依旧可以记住页面状态的需求。因为刷新浏览器页面的时候,等于是刷新了整个vue实例应用,所有vue缓存的数据都会丢失。

方案v2

基于方案1的缺陷,衍生出了方案v2

  • 为了满足刷新页面依然能够记住页面状态,我们需要把页面状态做持久化处理
  • 在localStorage, sessionStorage, cookie三种方案中,我选择了sessionStorage
  • 然后只需要,在页面刷新或者销毁之前,记录页面需要记住的参数。然后在页面加载的时候读取之前存储的参数。

为了可复用和尽量小的代码侵入性。我把相关代码封装成了一个mixin,代码如下:

// 定义一个混入对象
let paramsMemoryMixin = {
 data () {
  return {
   // 记住参数存储的key, 请在引用该mixin的组件中重写
   memoryParamsKey: 'nb-memory-params'
  }
 },
 created: function () {
  this.initParams();
  // 在页面刷新时将筛选信息保存到sessionStorage里
  window.addEventListener('beforeunload', this.onPageUnload);
 },
 methods: {
  initParams () {
   let userParams = JSON.parse(sessionStorage.getItem(this.memoryParamsKey));

   for (let key in userParams) {
    this[key] = userParams[key];
   }
  },
  onPageUnload () {
   sessionStorage.setItem(this.memoryParamsKey, JSON.stringify(this.getMemoryParams()));
  },

  /**
   * 需要记住的页面参数
   * @return { key: value }
   */
  getMemoryParams () {
   throw Error('请重写paramsMemoryMixin的getMemoryParams方法');
  }
 },

 beforeDestroy () {
  window.removeEventListener('beforeunload', this.onPageUnload);
 },

 beforeRouteLeave (to, from, next) {
  this.onPageUnload();
  next();
 }
};

export default paramsMemoryMixin;

然后,在需要缓存的页面,引入该mixin,并重写存储参数的键名: memoryParamsKey 和获取缓存数据的方法 getMemoryParams () 。例如:

import memoryMixin from '文件路径/params-memory-mixin.js';

export default {
 mixins: [ memoryMixin ],
 data () {
  return {
   // 记住参数存储的key
   memoryParamsKey: 'xx-xx-params'
  }
 },
 methods: {
  getMemoryParams () {
   return {
    key1: this.value1,
    key2: this.value2,
    key3: this.value3
   };
  }
 }
}

至此,问题解决。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中获取选中对象的类型
Apr 02 Javascript
一个简单的javascript类定义例子
Sep 12 Javascript
jQuery源码解读之removeAttr()方法分析
Feb 20 Javascript
jquery插件corner实现圆角边框的方法
Mar 09 Javascript
javascript无刷新评论实现方法
May 13 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
Aug 27 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
JS实现移动端整屏滑动的实例代码
Nov 10 Javascript
Vue实现购物车场景下的应用
Nov 27 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
Jan 03 Javascript
JavaScript中变量提升与函数提升经典实例分析
Jul 26 Javascript
iSlider手机端图片滑动切换插件使用详解
Dec 24 Javascript
uni-app 组件里面获取元素宽高的实现
Dec 27 #Javascript
Vue中axios拦截器如何单独配置token
Dec 27 #Javascript
JavaScript获取当前url路径过程解析
Dec 27 #Javascript
前端开发之便利店收银系统代码
Dec 27 #Javascript
JavaScript setInterval()与setTimeout()计时器
Dec 27 #Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
Dec 27 #Javascript
React中使用UMEditor的方法示例
Dec 27 #Javascript
You might like
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
js date 格式化
2017/02/15 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
React实现轮播效果
2020/08/25 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
python退出命令是什么?详解python退出方法
2018/12/10 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
运动会解说词200字
2014/02/06 职场文书
后备干部培训方案
2014/05/22 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
个人诉讼委托书范本
2014/10/17 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电