1. keepAlive
在router的js文件中加入keepAlive
| { |
| path: "/A", |
| name: 'A', |
| meta:{ |
| name: 'A' , |
| keepAlive: false , |
| }, |
| component: resolve => require(['../A.vue'], resolve) |
| }, |
| { |
| path: "/B", |
| name: 'B', |
| meta:{ |
| name: 'B' , |
| keepAlive: true , |
| }, |
| component: resolve => require(['../B.vue'], resolve) |
| }, |
| { |
| path: "/C", |
| name: 'C', |
| meta:{ |
| name: 'C' , |
| keepAlive: false, |
| }, |
| component: resolve => require(['../C.vue'], resolve) |
| }, |
复制
在APP.vue中加入以下代码
| <keep-alive> |
| <router-view v-if="$route.meta.keepAlive" /> |
| </keep-alive> |
| <router-view v-if="!$route.meta.keepAlive" /> |
复制
2. 清除缓存的几种方法
有A,B,C三个组件需要在B组件中加入缓存,从组件B跳转组件C再从组件C跳转组件B缓存保留,但从组件B跳转到组件A后将组件B的缓存清除。
第一种用直接暴力法,在组件切换之后直接刷新
在组件B中加入beforeRouteLeave()方法和Watch监听事件
| watch: { |
| $route(to, from) { |
| if(from.name === 'A'){ |
| this.route = from.name |
| |
| this.$router.go(0); |
| } |
| }, |
| }, |
| |
| beforeRouteLeave(to, from, next) { |
| from.meta.keepAlive = false |
| next() |
| } |
复制
组件B跳转到组件C组件B的缓存不清除,在组件C中加入beforeRouteLeave()方法
| beforeRouteLeave (to, from, next) { |
| |
| to.meta.keepAlive = true |
| next() |
| } |
复制
第二种方法用$vnode方法获取DOM元素,将缓存清除
组件B中加入beforeRouteLeave()方法
| beforeRouteLeave(to, from, next) { |
| if (to.path == "/C") { |
| from.meta.keepAlive = true; |
| } else { |
| let Vnode = this.$vnode; |
| let parentVnode = Vnode && Vnode.parent; |
| if (parentVnode && parentVnode.componentInstance && parentVnode.componentInstance.cache) { |
| var key = Vnode.key == null ? Vnode.componentOptions.Ctor.cid + (Vnode.componentOptions.tag ? `::${Vnode.componentOptions.tag}` : '') : Vnode.key; |
| var cache = parentVnode.componentInstance.cache; |
| var keys = parentVnode.componentInstance.keys; |
| if (cache[key]) { |
| this.$destroy(); |
| if (keys.length) { |
| var index = keys.indexOf(key); |
| if (index > -1) { |
| keys.splice(index, 1); |
| } |
| } |
| cache[key] = null; |
| } |
| } |
| } |
| next(); |
| } |
复制
在组件C中加入beforeRouteLeave()和beforeRouteEnter()方法
| data(){ |
| return{ |
| Fromvnode: null |
| } |
| } |
| beforeRouteEnter(to, from, next) { |
| next(vm => { |
| vm.Fromvnode = from |
| }) |
| }, |
| beforeRouteLeave(to, from, next) { |
| if (to.path !== '/B') { |
| this.Fromvnode.meta.keepAlive = false |
| } |
| next() |
| } |
复制