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

tongjiaojiao 2019-03-27 原文

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

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

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

在网上转了一圈,终于找到适合自己的方法——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:当我从列表一点击进入详情之后,如果直接从详情页,点击进入别的店铺列表页,即列表二,最新的列表页内展示的商品列表是之前的数据,并没有变为最新的店铺列表内容即列表二页面展示的还是列表一的商品

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

 

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

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

 

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

 

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


第一步:找到商品详情页,最为主角之一,我在这里用到了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列表情况,视觉感受会好一些

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

 

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

或许因为业务需求不同,技术处理方式可能会不同,希望能帮助到各位,或者给各位一些启发

 

posted on 2019-03-27 11:11 豆奶柚子君 阅读() 评论() 编辑 收藏

 

 
版权声明:本文为tongjiaojiao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tongjiaojiao/p/10606153.html

vue 详情跳转至列表页 实现列表页缓存的更多相关文章

  1. 原创~vue router-link添加点击事件

    原创~vue router-link添加点击事件 在学习vue中会遇到给router-link添加@click […]...

  2. uni-app,vue,react,Trao之缓存类封装

    uni-app,vue,react,Trao之缓存类封装 一,介绍与需求 1.1,介绍 缓存主要分为如下几个 […]...

  3. 关于Vue 兄弟组件通信

    关于Vue 兄弟组件通信 最近项目中遇到希望在操作路由组件里面内容的时候可以影响共用组件Header组件(这个 […]...

  4. 给大家整理了几个开源免费的 Spring Boot + Vue 学习资料

    最近抽空在整理前面的文章案例啥的,顺便把手上的几个 Spring Boot + Vue 的学习资料推荐给各位小 […]...

  5. Echarts实际开发用到的知识点的总结

            Echarts官网上说,ECharts,一个使用 JavaScript 实现的开源可视化库,可 […]...

  6. restapi(9)- caching, akka-http 缓存

    restapi作为前后端交互的枢纽:面对大批量的前端请求,需要确保回复的及时性。使用缓存是一项有效工具。我们可 […]...

  7. 深入理解Vue的生命周期

      谈到Vue的生命周期,相信许多人并不陌生。但大部分人和我一样,只是听过而已,具体用在哪,怎么用,却不知道。 […]...

  8. vue组件详解(三)——组件通信

    组件之间通信可以用下图表示: 组件关系可分为父子组件通信、兄弟组件通信、跨级组件通信。 一、自定义事件 当子组 […]...

随机推荐

  1. HBase数据存储格式

    好的数据结构。对于检索数据,插入数据的效率就会非常高。 常见的数据结构 B+树 根节点和枝节点非常easy,分 […]...

  2. UE4 几个好用的插件和Wiki教程

    转自:http://blog.csdn.net/u014532636/article/details/7272 […]...

  3. 移动网络与普适计算

    可穿戴计算技术浅析   摘要可穿戴计算技术就是把计算机“穿”在身上进行应用的技术,该技术解放了人的双手,在对计 […]...

  4. Layui多文件上传进度条

    Layui原生upload模块不支持文件上传进度条显示,百度,谷歌找了一下不太适用。后面找到一个别人修改好的J […]...

  5. swiper.js 响应式多图轮播特效

    swiper.js实现响应式的左右切换图片案例展示布局 1、head引入css文件 <link type […]...

  6. maven项目有红叉,感叹号如何解决?

    红色感叹号,pom.xml文件有红叉 修改了Maven私服服务器的IP地址。可在Maven安装路径下的conf […]...

  7. 贪心算法之背包问题

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑 […]...

  8. Oracle11g安装教程——超详细

    Oracle11g安装教程–windows系统 以win10为例 首先下载安装包,我的网盘上有:https:/ […]...

展开目录

目录导航