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_01_理解内存分配原理分析
Oct 11 Javascript
jQuery写的日历(包括日历的样式及功能)
Apr 23 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
May 31 Javascript
深入分析node.js的异步API和其局限性
Sep 05 Javascript
详解javascript中对数据格式化的思考
Jan 23 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
js实现会跳动的日历效果(完整实例)
Oct 18 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
Mar 19 jQuery
vue本地打开build后生成的dist文件夹index.html问题
Sep 04 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
Sep 26 Javascript
JavaScript代码实现简单计算器
Dec 27 Javascript
iview实现动态表单和自定义验证时间段重叠
Jan 10 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如何透过ODBC来存取数据库
2006/10/09 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
JavaScript中set与get方法用法示例
2018/08/15 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
用Python编写简单的定时器的方法
2015/05/02 Python
Python面向对象特殊成员
2017/04/24 Python
Django 前后台的数据传递的方法
2017/08/08 Python
Python实现的质因式分解算法示例
2018/05/03 Python
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
团日活动总结
2014/04/28 职场文书
工程承诺书怎么写
2014/05/24 职场文书
企业人事任命书
2014/06/05 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
生日寿星公答谢词
2015/09/29 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript