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 相关文章推荐
pjblog修改技巧汇总
Mar 12 Javascript
javascript正则表达式中参数g(全局)的作用
Nov 11 Javascript
JavaScript中使用Substring删除字符串最后一个字符
Nov 03 Javascript
javascript表单验证大全
Aug 12 Javascript
举例讲解JavaScript substring()的使用方法
Nov 09 Javascript
如何在JS中实现相互转换XML和JSON
Jul 19 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
Jan 03 Javascript
Js实现京东无延迟菜单效果实例(demo)
Jun 02 Javascript
vue中组件的过渡动画及实现代码
Nov 21 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
Oct 15 Javascript
JavaScript构造函数原理及实现流程解析
Nov 19 Javascript
JS新手入门数组处理的实用方法汇总
Apr 07 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
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
python模块restful使用方法实例
2013/12/10 Python
Python最基本的输入输出详解
2015/04/25 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
Python定义一个函数的方法
2020/06/15 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
戴森英国官网:Dyson英国
2019/05/07 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
关于元旦的广播稿
2014/02/16 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
第一军规观后感
2015/06/12 职场文书
Spring Boot 实现 WebSocket
2022/04/30 Java/Android