时间:2022-9-14 作者:悬浮的青春 分类: javascript
keep-alive
可以实现组件缓存,当组件切换时不会对当前组件进行卸载。
主要是有include、exclude、max
三个属性;前两个属性允许keep-alive
有条件的进行缓存;max
可以定义组件最大的缓存个数,如果超过了这个个数的话,在下一个新实例创建之前,就会将以缓存组件中最久没有被访问到的实例销毁掉。
两个生命周期activated/deactivated
,用来得知当前组件是否处于活跃状态。
使用 keep-alive 包裹 router-view,同时指定需要缓存的组件名称。(PS:请在要缓存的组件中,写明 name 属性,并赋值。不然缓存不生效)
App.vue
<template>
<div id="app">
<keep-alive include="Home">
<router-view/>
</keep-alive>
</div>
</template>
### 结合 Router,缓存页面
router.js
```javascript
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'home',
component: Home,
meta: {
keepAlive: true
}
},
{
path: '/about',
name: 'about',
component: () => import('./views/About.vue')
},
]
})
Home.vue
<script>
export default {
name: "Home",
beforeRouteLeave(to, from, next) {
to.meta.keepAlive = true;
next();
},
};
</script>
App.vue
<template>
<div id="app">
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
</div>
</template>
剩下的一些其他特性,可以自行前往官网查阅
keep-alive中运用了LRU(Least Recently Used)
算法。
keep-alive
包裹着的第一个子组件对象及其组件名; 如果 keep-alive 存在多个子元素,keep-alive
要求同时只有一个子元素被渲染。所以在开头会获取插槽内的子元素,调用 getFirstComponentChild
获取到第一个子元素的 VNode
。VNode
),否则开启缓存策略。this.keys
中的位置(更新key的位置是实现LRU
置换策略的关键)。this.cache
对象中存储该组件实例并保存key值,之后检查缓存的实例数量是否超过max设置值,超过则根据LRU
置换策略删除最近最久未使用的实例(即是下标为0的那个key)。最后将该组件实例的keepAlive
属性值设置为true
。