1.keep-alive的介绍
keep-alive是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。
keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 transition>相似,keep-alive是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中
2.两个参数(prop)
1 2
| include: 字符串或正则表达式。只有匹配的组件会被缓存。 exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存
|
3.常见用法
1 2 3 4 5 6 7 8 9 10
| export default { name: 'music', data () { return { includedComponents: 'music' } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <keep-alive include="music"> <component></component> </keep-alive>
<keep-alive include="a,b"> <component :is="view"></component> </keep-alive>
<keep-alive :include="/a|b/"> <component :is="view"></component> </keep-alive>
<keep-alive :include="includedComponents"> <router-view></router-view> </keep-alive>
<keep-alive exclude="test-keep-alive"> <component></component> </keep-alive>
|
4.结合router,缓存部分页面
1 2 3 4 5
| 使用$route.meta的keepAlive属性: <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 需要在router中设置router的元信息meta:
export default new Router({ routes: [ { path: '/', name: 'Hello', component: Hello, meta: { keepAlive: false } }, { path: '/page1', name: 'Page1', component: Page1, meta: { keepAlive: true } } ] })
|
首页是A页面
B页面跳转到A,A页面需要缓存
C页面跳转到A,A页面不需要被缓存
思路:在每个路由的beforeRouteLeave(to, from, next)钩子中设置to.meta.keepAlive
keep-alive生命周期钩子函数:activated、deactivated
使用<keep-alive>会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在activated阶段获取数据,承担原来created钩子中获取数据的任务。
A的路由:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| { path: '/', name: 'A', component: A, meta: { keepAlive: true // 需要被缓存 } } export default { data() { return {} }, methods: {}, beforeRouteLeave(to, from, next) { // 设置下一个路由的 meta to.meta.keepAlive = true next() } } export default { data() { return {} }, methods: {}, beforeRouteLeave(to, from, next) { // 设置下一个路由的 meta to.meta.keepAlive = false next() } }
|
感谢鼓励