vue 详情跳转至列表页实现列表页缓存


Posted in Javascript onMarch 27, 2019

甲爸爸提了一个需求,希望公众号内的商城能够像app一样,从商品详情页跳转至列表页及其他列表页时,可以实现列表页缓存(数据不刷新、位置固定到之前点的商品的位置)

本来想着scrollBehavior应该可以满足,但是实际操作中发现:如果列表带着分页,位置是不会定位到点击的位置的

vue 详情跳转至列表页实现列表页缓存

在网上转了一圈,终于找到适合自己的方法——beforeRouteLeave

注:beforeRouteLeave只对一级页面起作用,不适用于children中的其他二级或其他级别的页面 

以上是准备工作,接下来 可以步入正题了:

找到入口挂载页面:App.vue 在router-view外部包裹一个keep-alive的标签

因为不是所有页面都需要缓存,所以把需要缓存的页面中加入name值,并将name值加入keep-alive中

<keep-alive v-if="isRouterAlive" include="starShop" >
  <router-view></router-view>
</keep-alive>

当然,仅仅是这些,是不能实现缓存的,

刚开始我是学着网上的方法,这样写的,当从列表点入详情页时,就将 列表页的keepalive值,赋为true (实现缓存)

beforeRouteLeave(to, from, next) {
  if(from.path == '/sale/newGoods/index' && to.path == '/goods/detail') {
    from.meta.keepAlive = true;
    this.loading = true;
    next();
    return
  } else {
    from.meta.keepAlive = false;
    window.location.reload();
    this.$destroy();
    next();
    return
  }
},

但是后期甲爸爸发现一个bug: 当我从列表一点击进入详情之后,如果直接从详情页,点击进入别的店铺列表页,即列表二,最新的列表页内展示的商品列表是之前的数据,并没有变为最新的店铺列表内容 , 即列表二页面展示的还是列表一的商品

玩大了,这个问题比较着急啊,万一把顾客绕晕了,人家不买东西了,那我罪过不就大了咩

vue 详情跳转至列表页实现列表页缓存

晚上趁着月黑风高、夜深人静的时候,我苦思冥想,终于把这个社会毒瘤挖掉了

我绝不是屈居于甲爸爸的淫威之下,只是因为我对技术的执著,过度追求完美的我,忍受不聊我的东西出现这样大的漏洞

要看解决办法的直接来这    ↓↓↓↓↓↓

首先摒弃上面的列表页面的方法

第一步:找到商品详情页,最为主角之一,我在这里用到了beforeRouteEnter、beforeRouteLeave

beforeRouteEnter (to, from, next) {
  next(vm =>{
    vm.formUrl = from.path;
    console.log(vm.formUrl)
  });
},
beforeRouteLeave(to, from, next) {
  to.meta.keepAlive = false;
  if(to.path == this.formUrl){
    to.meta.keepAlive = true;
    next();
    return
  }else{
    to.meta.KeepAlive = false;
    window.localStorage.removeItem('isRefresh')
    this.$destroy();
    next();
    return
  }
},

beforeRouteEnter:进入路由之前执行的函数(拿到列表一的路由)

beforeRouteLeave:离开路由之前执行的函数(拿到列表二的路由)

通过这两个钩子,可以成功的拿到事件的另外两位主角路由(列表一、列表二)

在详情页中,当离开该页之前,在beforeRouteLeave内进行列表一、列表二的路由比较

若两路由相同,则跳转目的页面(to.meta.keepAlive)值为true,列表页面进行缓存(比如从详情页返回的时候)

若两路由不同,则跳转目的页面发生了变化(比如从鞋帽列表——>鞋子商品——>鞋子列表),则鞋子列表页面不需要缓存,需要刷新获取最新的鞋子列表数据

第二步:处理事件的第二主角——列表页面

这里我仅用到了beforeRouteEnter

这个钩子中,我们可以拿到当前页面的keepAlive值

这个值是在详情页中就已经给定的

如果是true,表示缓存,否则为不缓存(刷新)

防止页面一直刷新,变成死亡函数,我们要在data中声明一个变量isRefresh

isRefresh: window.localStorage.getItem('isRefresh') || true
beforeRouteEnter (to, from, next) {
  next(vm =>{
    if(to.meta.keepAlive != true && to.meta.keepAlive != null){
      vm.goods=[];
      window.localStorage.setItem('isRefresh',true)                
            if(JSON.stringify(window.localStorage.getItem('isRefresh')) != false){
                  
                window.localStorage.setItem('isRefresh',false)
        location.reload();
      }  
    }
  });
  return
},

如果当前页to.meta.keepAlive值不为true,且值存在,则需刷新页面

防止页面一直刷新,

window.localStorage.setItem('isRefresh',true)

设置缓存变量isRefresh,值为true(表示需要刷新)

当to.meta.keepAlive值不为true且isRefresh值为true,页面刷新,且isRefresh赋值为false,即关闭刷新

vm.goods=[];是当页面跳去新的列表页刷新之前,会出现短暂的列表展示,为了避免不必要的误导,在检测到是跳转到新的列表页时,我将列表页的goods列表情况,视觉感受会好一些

因项目不同而异,不需要可以去掉

多张页面之间跳转,判断是否需要缓存或刷新获取新数据,就是这样了

或许因为业务需求不同,技术处理方式可能会不同,希望能帮助到各位,或者给各位一些启发,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 冒号 使用说明
Jun 06 Javascript
JavaScript 模拟用户单击事件
Dec 31 Javascript
基于jquery的获取mouse坐标插件的实现代码
Apr 01 Javascript
jQuery异步验证用户名是否存在示例代码
May 21 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
Jun 18 Javascript
Vue.js每天必学之过滤器与自定义过滤器
Sep 07 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
jquery实现选项卡切换代码实例
May 14 jQuery
解决vue中使用proxy配置不同端口和ip接口问题
Aug 14 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
Jul 17 Javascript
详解vue父子组件状态同步的最佳方式
Sep 10 Javascript
微信小程序 接入腾讯地图的两种写法
Jan 12 Javascript
vue中多个倒计时实现代码实例
Mar 27 #Javascript
JavaScript偏函数与柯里化实例详解
Mar 27 #Javascript
vue实现鼠标移入移出事件代码实例
Mar 27 #Javascript
JavaScript惰性载入函数实例分析
Mar 27 #Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
Mar 27 #Javascript
详解JS浏览器事件循环机制
Mar 27 #Javascript
详解如何更好的使用module vuex
Mar 27 #Javascript
You might like
php目录管理函数小结
2008/09/10 PHP
php 高性能书写
2010/12/11 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
JavaScript—window对象使用示例
2013/12/09 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
详解React 16 中的异常处理
2017/07/28 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
医院总经理职责
2013/12/26 职场文书
企业演讲稿范文
2013/12/28 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers