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 相关文章推荐
js客户端快捷键管理类的较完整实现和应用
Jun 08 Javascript
JS比较2个日期间隔的示例代码
Apr 15 Javascript
jQuery的context属性用法实例
Dec 27 Javascript
jQuery过滤特殊字符及JS字符串转为数字
May 26 Javascript
谈谈对JavaScript原生拖放的深入理解
Sep 20 Javascript
vue实现添加与删除图书功能
Oct 07 Javascript
微信小程序wx.navigateTo方法里的events参数使用详情及场景
Jan 07 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
Feb 15 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
Mar 14 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
Jun 01 Javascript
Vue单文件组件开发实现过程详解
Jul 30 Javascript
给原生html中添加水印遮罩层的实现示例
Apr 02 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
用Flash图形化数据(二)
2006/10/09 PHP
第十三节--对象串行化
2006/11/16 PHP
解析PHP提交后跳转
2013/06/23 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
js运动事件函数详解
2016/10/21 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
在Python中处理XML的教程
2015/04/29 Python
Python中的rfind()方法使用详解
2015/05/19 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
python学生信息管理系统(初级版)
2018/10/17 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
体育教育专业自荐信范文
2013/12/20 职场文书
知名企业招聘广告词大全
2014/03/18 职场文书
体育教师个人工作总结
2015/02/09 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书