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实现上传图片并预览的效果实现代码
Apr 11 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
Jan 04 Javascript
JS冒泡事件的快速解决方法
Dec 16 Javascript
基于jQuery实现的图片切换焦点图整理
Dec 07 Javascript
详解JavaScript中数组的reduce方法
Dec 02 Javascript
详解JavaScript中的属性和特性
Dec 08 Javascript
js实现悬浮窗效果(支持拖动)
Mar 09 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
Apr 13 Javascript
vue与原生app的对接交互的方法(混合开发)
Nov 28 Javascript
利用JS代码自动删除稿件的普通弹幕功能
Sep 20 Javascript
js判断在哪个浏览器打开项目的方法
Jan 21 Javascript
Vue vm.$attrs使用场景详解
Mar 08 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
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
Javascript调用C#代码
2011/01/17 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
2020/11/06 Javascript
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
生产厂长岗位职责
2014/02/21 职场文书
网站美工岗位职责
2014/04/02 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
大学生实训报告总结
2014/11/05 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python