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 相关文章推荐
跨浏览器的设置innerHTML方法
Sep 18 Javascript
JQuery与Ajax常用代码实现对比
Oct 03 Javascript
JS中获取数据库中的值的方法
Jul 14 Javascript
封装好的一个万能检测表单的方法
Jan 21 Javascript
javascript实现字符串反转的方法
Feb 05 Javascript
JavaScript中的Repaint和Reflow用法详解
Jul 27 Javascript
js倒计时抢购实例
Dec 20 Javascript
纯JS代码实现一键分享功能
Apr 20 Javascript
jQuery ajax请求struts action实现异步刷新
Apr 19 jQuery
JS+HTML5 canvas绘制验证码示例
Dec 05 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
Dec 29 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
May 10 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
php flv视频时间获取函数
2010/06/29 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
javaScript对象和属性的创建方法
2007/01/15 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
JavaScript简介
2015/02/15 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
详解使用nvm安装node.js
2017/07/18 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
学校介绍信范文
2014/01/14 职场文书
三分钟自我介绍演讲稿
2014/08/21 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
详解Python如何批量采集京东商品数据流程
2022/01/22 Python
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server