#keep-alive缓存动态路由的使用指南#
代码如下图 :
<router-view v-slot="{ Component }"> <keep-alive :include="['Hot', 'Notifications', 'User', 'Setting', 'Test']"> <component :is="Component" /></keep-alive>
</router-view>
讲解:
一、v-slot="{ Component }" 的作用
这是 Vue 的作用域插槽语法,用于从 <router-view> 中获取当前路由对应的组件实例。
具体解释:
-
<router-view>的职责
Vue Router 的<router-view>是一个动态容器,会根据当前路由路径渲染对应的组件(例如/home渲染HomeComponent,/about渲染AboutComponent)。 -
作用域插槽的暴露
通过v-slot="{ Component }",<router-view>会将当前匹配到的组件实例以Component变量的形式暴露给父组件。 -
为何需要这个语法?
为了在<router-view>外层包裹其他逻辑(如添加动画、缓存控制等),需要先获取到当前路由对应的组件实例,再手动渲染它。
二、:is="Component" 的作用
这是 Vue 的动态组件语法,用于动态决定要渲染哪个组件。
具体解释:
-
<component>元素
Vue 内置的<component>是一个特殊元素,它通过:is属性绑定要渲染的组件。 -
与路由结合
在路由场景中,Component是从<router-view>的作用域插槽中获取的当前路由组件。等价于直接渲染<router-view>的内容,但通过这种写法可以添加额外逻辑(例如包裹<keep-alive>)。
三、include 的作用
1. 核心功能
-
缓存白名单:
include接受一个组件名称的数组(字符串或正则表达式),只有匹配名称的组件才会被<keep-alive>缓存。 -
避免重复渲染:被缓存的组件切换时不会触发
onMounted生命周期,而是通过onActivated/onDeactivated管理状态。
2. 必须匹配组件的 name 选项
-
组件定义时必须显式声明
name
被缓存的组件需要在其选项中明确设置name字段
Tip:
一个小tip,如果要保持路由缓存,相关跳转不要用a标签,用route.push(),不然会导致路由重新加载