routes:[{ path: ‘/search‘, name: ‘search‘, component: search, meta: { title: ‘搜索列表页‘, keepAlive: true // 标记列表页需要被缓存 } }, { path: ‘/detail‘, name: ‘detail‘, component: detail, meta: { title: ‘详情页‘, // 详情页不需要做缓存,所以不加keepAlive标记 } }]
由于<keep-alive>组件不支持v-if指令,所以我们在App.vue中采用两个<router-view>的写法,通过当前路由的keepAlive字段来判断是否对页面进行缓存
如果组件需要缓存就走keep-alive,如果组件不需要缓存就直接router-view
<div id="app"> <keep-alive> <router-view v-if="$route.meta.keepAlive" /> </keep-alive> <router-view v-if="!$route.meta.keepAlive" /> </div>
<div id="app"> <keep-alive exclude="detail"> <router-view /> </keep-alive> </div>
需要注意的是,一定要给页面组件加上相应的name,例如在detail.vue中:
<script> export default { name: ‘detail‘, // 这个name要和keep-alive中的exclude选项值一致 ... } </script>
这么写就代表了在项目中除了name为detail的页面组件外,其余页面都将进行缓存。
要明白一个道理:
如果组件没有被缓存,当重新打开时,此组建的生命周期会重新再来一遍;如果组件被缓存了,此时重新返回组件时生命周期不会重新再来一遍;
vue还提供了两个生命周期函数:actived,deactived
(actived当组件缓存之后,其他的生命周期不会走,但这个每次进去组件都触发,相当于激活组件)
(deactived当组件缓存之后,其他的生命周期不会走,但这个每次离开组件都触发,相当于使组件休眠)
还有需要注意的问题是: 被缓存的组件中如果还有子组件, 那么子组件也会一并拥有 激活和唤醒事件,并且这些事件会在同时执行
原文:https://www.cnblogs.com/yaya-003/p/12899059.html