记:vue的keeplive缓存列表页面的浏览位置

如下图,我们在使用vue2.0时经常会遇到这样的场景:从一个列表页面进入详情页,然后返回列表页的时候我们想还停留在上次浏览的位置。

实现这样的方法很简单:

  • 首先我们在路由文件中当前页面的路由加上一条meta

// 分类页面路由
{      
    path: '/category',      
    name: 'Category',      
    component: Category,      
    meta: {          
        keepAlive: true      
    }
}复制代码

  • 然后在app.vue中修改一下router-view:

<keep-alive >        
    <router-view v-if="$route.meta.keepAlive"/>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"/>复制代码

表示,路由的meta.keepAlive为true的时候,进行页面的缓存,否则不缓存。

然而,我们实际的需求可能比这更为复杂。例如,从列表页到详情页然后返回列表页,需要缓存上次已经加载的数据和用户浏览的位置,但是如果从其他页面(例如首页)进入列表页,我们不需要他缓存,而是要初始化的状态。这时候我们可以在列表页面的beforeRouteLeave周期内加上一个判断,判断如果是从列表页前往详情页,则缓存页面,否则不缓存:

beforeRouteLeave (to, from, next) {
    from.meta.keepAlive = to.name == 'Detail';            
    next();            
}复制代码

测试了下,缓存正常。

在此基础上,我们可能会遇到再复杂一些的场景。例如订单列表到订单详情的这种场景。正常情况下从详情返回的时候是需要列表页缓存数据的,但是如果详情页有删除订单的操作,那么删除完订单返回列表页时,我们是希望列表页刷新的。那么怎么处理这个问题呢?

我们可以在订单详情页的beforeRouteLeave周期内增加判断:

beforeRouteLeave (to, from, next) {
    // 如果是前往订单页,且已经进行了删除订单的操作
    // 那么将不缓存订单页,而是刷新
    if (to.name == 'Order' && this.isDelete) {
        to.meta.keepAlive = false;
    }         
    next();            
}复制代码

this.isDelete在data中默认是false,只有当完成删除订单之后,才会将其赋值为true,例如,下面是一个删除订单的函数:

deleteOrder(){
    //进行删除订单操作
    this.axios.get('接口地址')
        .then(res=> {
            // 假设这里是接口返回成功的时候
            // 表示已经删除订单
            this.isDelete = true;
            // 返回订单页面
            this.$router.go(-1);
        })
    .catch(err=> {
        // 处理错误
    })
}复制代码

至此,如果详情页没有删除订单的情况下返回订单页,则缓存数据,如果在详情页进行了删除订单的操作后返回订单页面,则重新刷新订单页面数据。


码字不易,欢迎给下小心心吧~~


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值