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 相关文章推荐
jQuery 1.0.4 - New Wave Javascript(js源文件)
Jan 15 Javascript
JQuery 解析多维的Json数据格式
Nov 02 Javascript
有关javascript的性能优化 (repaint和reflow)
Apr 12 Javascript
jqGrid读取选择的多行的某个属性代码
May 18 Javascript
详解Javascript动态操作CSS
Dec 08 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
Sep 06 Javascript
jQuery基于ajax操作json数据简单示例
Jan 05 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
Sep 28 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
Nov 09 Javascript
详解React中setState回调函数
Jun 14 Javascript
利用原生JavaScript实现造日历轮子实例代码
May 08 Javascript
JavaScript直接调用函数与call调用的区别实例分析
May 22 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
综合图片计数器
2006/10/09 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
JS实现倒计时图文效果
2018/11/17 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
python中去空格函数的用法
2014/08/21 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
Servlet如何得到客户端机器的信息
2014/10/17 面试题
大学生求职工作的自我评价
2014/02/13 职场文书
丧事主持词大全
2014/04/02 职场文书
个人授权委托书范文
2014/09/21 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL