一、前言
1、概念
keep-alive 是 Vue 的内置组件
,当它包裹动态组件时,会缓存不活动的组件实例
,而不是销毁它们。和 transition 相似,keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素
,也不会出现在父组件链中。
2、功能
在组件切换过程中将状态保留在内存中,防止重复渲染DOM,
减少加载时间及性能消耗,提高用户体验性
3、属性
include
- 字符串或正则表达式。只有名称匹配的组件会被缓存。exclude
- 字符串或正则表达式。任何名称匹配的组件都不会被缓存。max
- 数字。最多可以缓存多少组件实例。
生命周期函数
4、生命周期
activated
keep-alive组件激活时调用,在服务器端渲染期间不被调用
deactivated
keep-alive组件停用时调用,在服务器端渲染期间不被调用
5、执行顺序及注意事项
首次进入缓存页面
beforeCreate > created > beforeMount > mounted > activated > deactivated
再次进入缓存页面
activated > deactivated
注
- 注:使用 keep-alive 会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,
需要在 activated 中获取数据,承担原来 created 钩子函数中获取数据的任务
。
// 每次进入被缓存页面更新列表数据,具体可根据实际需求调整
activated(){
getList()
}
- 注:只有组件被 keep-alive 包裹时,两个生命周期函数才会被调用,在服务端渲染时,此钩子函数不会被调用。
二、案例详解
1、缓存所有页面
<template>
<div id="app">
<keep-alive>
<router-view/>
</keep-alive>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
2、根据条件缓存页面
- 通过
include/exclude
属性,结合页面name,缓存符合条件的组件, max
可限制缓存的达最大组件实例数量。
App.vue页面
<template>
<div id="app">
<!-- 1. 将缓存 name 为 test 的组件 -->
<keep-alive include='test'>
<router-view/>
</keep-alive>
<!-- 2. 将缓存 name 为 a 或者 b 的组件 -->
<keep-alive include='a,b'>
<router-view/>
</keep-alive>
<!-- 3. 使用正则表达式,需使用 v-bind -->
<keep-alive :include='/a|b/'>
<router-view/>
</keep-alive>
<!-- 4. 动态判断 -->
<keep-alive :include='includedComponents'>
<router-view/>
</keep-alive>
<!-- 5. 将不缓存 name 为 test 的组件 -->
<keep-alive exclude='test'>
<router-view/>
</keep-alive>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
3、结合Router,缓存部分页面
通过路由mate携带的信息,可灵活控制页面缓存
router > index.js
import Vue from 'vue'
import Router from 'vue-router'
const Home = resolve => require(['@/components/home/home'], resolve)
const Goods = resolve => require(['@/components/home/goods'], resolve)
const Ratings = resolve => require(['@/components/home/ratings'], resolve)
const Seller = resolve => require(['@/components/home/seller'], resolve)
Vue.use(Router)
export default new Router({
mode: 'history',
routes: [
{
path: '/',
name: 'home',
component: Home,
redirect: 'goods',
children: [
{
path: 'goods',
name: 'goods',
component: Goods,
meta: {
keepAlive: false // 不需要缓存
}
},
{
path: 'ratings',
name: 'ratings',
component: Ratings,
meta: {
keepAlive: true // 需要缓存
}
},
{
path: 'seller',
name: 'seller',
component: Seller,
meta: {
keepAlive: true // 需要缓存
}
}
]
}
]
})
App.vue
- 例:
路由信息中keepAlive属性为true的缓存,为false的正常渲染
<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>
<script >
export default {
name: 'App'
}
</script>