vue的keep-alive组件使用详解(亲测可用)

码界先锋
• 阅读 1531
文章开头,先说一下我遇到的问题,如果不是类似业务逻辑,那么可能会遇到方法不可用的效果,淡定~~~

我的问题是:当前有3个页面,首页(简称A)、列表页面(简称B)、详情页面(简称C),从A->B,B->C,C->B,这时,希望B页面状态为进入C页面时的状态,B->A,A->B,这时希望B页面是页面初始状态,但是我之前用

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

这种方法,只能实现B->C->B时页面被缓存,B->A->B之后不是初始状态

话不多说!看方法!

运用vue的include和exclude方法
App.vue中这样写

<div id="app">
    <keep-alive :include="keepAlive">
        <router-view class="router-view"></router-view>
    </keep-alive>
</div>

B.vue中需要用两个生命周期函数来做逻辑处理  beforeRouteEnter和beforeRouteLeave

beforeRouteEnter (to, from, next) {
    next(vm => {
     //判断是否从C页面进入,如果是,那么仍需将B页面缓存
        if (from.name === 'C') {
            vm.$store.commit('setKeepAlive', ['B'])
        }
    })
},
beforeRouteLeave (to, from, next) {
  //判断将要去的页面是否为C,若是,则需要将B页面缓存
    if (to.name === 'C') {
        this.$store.commit('setKeepAlive', ['vehicleManage'])
    }else {
  //否则将缓存队列清空,(这里清空缓存队列依据情况而定,我只需要缓存这一个页面,所以做了清空,如果不知道不用清空应该怎么做的情况下,可以在store中多设置几个缓存队列的全局数组)
        this.$store.commit('setKeepAlive', [])
    }
    next()
},

store.js中需要给全局store对象加上这个属性

const state = {
    keepAlive: \[''\],
}

//mutations属性中加上set来修改这个属性
setKeepAlive (state, keepAlive) {
    state.keepAlive \= keepAlive
}   
  
//然后在getters中来获取这个属性

getters: {  
    keepAlive: state => {  
        return state.keepAlive  
    },  
}

最终,在App.vue中监听该属性变化,并且动态传给keep-alive的include属性

computed: {
   //将监听到的keepAlive属性,动态穿给keep-alive组件(文章开头的App.vue代码)
     keepAlive () {
          return this.$store.getters.keepAlive
     }
},

以上,就是我碰到这个问题之后,所用的方法
在此有一点点想要吐槽的地方,我在没有找到这个办法的时候用了文章最开头那种方法,通过 v-if 来判断缓存组件是否显示,但是我发现这个方法的使用场景不仅单一,而且不能支持更深的逻辑,但是发现好多人都在用这种方法,而且都是亲自测过可以使用,我不太明白是我没有用对,还是他们的自测不够深入,谨代表我的少许疑问,有怪莫怪!!!

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
springboot整合fastJson遇到重定向问题
通过网上教程使用springboot整合fastJson后遇到页面重定向问题(使用的springboot版本是2.0.2.RELEASE,其他的版本可能不会出现以下问题),如下图:!(https://oscimg.oschina.net/oscnet/5f860c56a7b841bd9e4326b8d0eeb4fd741.png)我的项目结构如
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Stella981 Stella981
3年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Stella981 Stella981
3年前
Spring Cloud(三):服务容错保护——Spring Cloud Hystrix
  在微服务架构中,通常会出现服务不可用的现象,假设A为服务提供者,B为A服务的调用者,C、D为B服务的调用者,那么当A服务不可用之后,随着时间的推移就会导致B服务不可用,B服务的不可用可能会导致C、D服务的不可用,最终导致整个系统的不可用,为了解决这种级联失败的问题,在分布式架构中出现了断路器等一系列服务保护机制。  在SpringCloud中使用H
Easter79 Easter79
3年前
Springboot+vue实现上传视频并在线播放功能
点击上方web项目开发,选择设为星标优质文章,及时送达效果图前端上传视屏页面!(https://oscimg.oschina.net/oscnet/c044525090ad8cb0f4762c24a15724b5bb8.png)前端上传视屏成功页面!(https://oscimg
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Stella981 Stella981
3年前
Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?
!(https://oscimg.oschina.net/oscnet/b8c8b22b9f44bd806c26b486e1893a263a4.jpg)这是我的第56篇原创文章!(https://oscimg.oschina.net/oscnet/8bf00bc92f6a1cd46596ee44bac64a801ae.pn
Stella981 Stella981
3年前
Spring Boot如何利用AOP巧妙记录操作日志?
!(https://oscimg.oschina.net/oscnet/7f1d6247ad65413fbca3b77b0bb9433c.png)点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/3f5a1c2360f9430c93a00b4715527ed9.jpg)本篇
Wesley13 Wesley13
3年前
MBR笔记
<bochs:100000000000e\WGUI\Simclientsize(0,0)!stretchedsize(640,480)!<bochs:2b0x7c00<bochs:3c00000003740i\BIOS\$Revision:1.166$$Date:2006/08/1117
Stella981 Stella981
3年前
CSS实现文字两端对齐
最近的项目遇到了这样的需求:(要求标题部分不管文字多少,都必须两端对齐)如下图:!(https://oscimg.oschina.net/oscnet/6e151291c0c55e2a231d00ec198d6c5be11.png)当时也没有多想直接使用‘&ensp;’进行代替,毕竟产品同学想快一点看到效果,不敢怠慢!不过到第二个页面就傻眼了
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(