使用 vue-router的keep-alive的一次踩坑记录

使用 vue-router的keep-alive的一次踩坑记录

背景:vue项目,需要缓存某些页面中的一个页面,于是就想到了keep-alive,于是屁颠屁颠的拿来用了,简单的从一个页面跳转到另一个页面再返回,ok页面被缓存了,天真的我就把代码一通提交,第二天测试才发现原来keep-alive有坑。。。

先放一段我的心路历程

1、有三个页面A、B、C;B页面需要被缓存,其他页面不缓存,我在B页面的路由里面加了meta: {keepAlive: true } ,
vue页面添加判断,这种方法网上很多很容易找到,就不放具体代码了,主要说下思路

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

2、页面 A->B->C
A->B B不缓存
C->B B缓存
3、我在B页面加了路由离开的监听,
判断B到C的时候,把B的keepAlive设置为true,
如果从B到A的时候,把B的keepAlive设置为false
4、问题是,第一遍从A->B->C,再顺序返回的时候,B页面的缓存是正常的,第二遍再从A->B->C,顺序返回的时候,B页面缓存的是第一次的缓存
为什么会一直缓存第一次加载过的页面???怪我才疏学浅,暂时还搞不清楚
在网上找了很多例子,修改router.options的等等,不行

我的解决办法

利用activated解决

<keep-alive include="a">
      <router-view ></router-view>
</keep-alive>

1、使用 include属性缓存需要的页面,这个我只需要缓存一个就写固定值了,这个值是可以动态的;
2、在vuex中定义一个全局变量 isUpdate
3、然后在B页面添加路由离开的监听

beforeRouteLeave (to, from, next) {
        if (to.name === 'c') {
            this.$store.commit('map/setPageUpdate', false)
        } else {
            this.$store.commit('map/setPageUpdate', true)
        }
        next()
    }

4、在a和c页面,使用 activated 生命周期函数(使用keep-alive之后会出现 actived 和deactived两个生命周期函数)

//在a和c页面
activated () {
        let isUpdate = this.$store.state.map.isUpdate
        if (isUpdate) {
            //如果要更新,就做更新的操作
        }
    },

总结

此方法仅适用于需要缓存某个页面,多个页面的缓存不赞成此方法,后续有更好的方法再更新

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值