面试题答案
一键面试实现方法及示例
- 在
<keep - alive>
标签中使用exclude
属性:- 示例:
这里假设<keep - alive :exclude="['ComponentB', 'ComponentC']"> <router - view></router - view> </keep - alive>
ComponentB
和ComponentC
是不想被缓存的组件,exclude
属性的值可以是一个数组,数组元素为组件的名称(组件通过name
选项定义的名称)。 - 原理:
keep - alive
组件会根据exclude
属性中指定的组件名称,当这些组件进入视图时,不会将其缓存起来。Vue 内部在处理keep - alive
时,会对进入和离开的组件进行判断,如果组件名称在exclude
数组中,则不会执行缓存相关操作,组件每次进入视图时都会重新创建和销毁。
- 示例:
- 在组件内部使用
meta
字段(结合路由时):- 示例:
- 路由配置文件
router.js
中:
const routes = [ { path: '/componentB', name: 'ComponentB', component: () => import('@/components/ComponentB.vue'), meta: { keepAlive: false } }, { path: '/componentC', name: 'ComponentC', component: () => import('@/components/ComponentC.vue'), meta: { keepAlive: false } } ];
- 在父组件中使用自定义指令来判断并处理:
<template> <keep - alive v - for="route in $route.matched" :key="route.path" v - if="route.meta.keepAlive"> <router - view></router - view> </keep - alive> </template>
- 路由配置文件
- 原理:通过在路由的
meta
字段中自定义keepAlive
字段来标记组件是否需要被缓存。在父组件中,通过v - for
遍历当前路由匹配的所有路由记录,并根据meta.keepAlive
的值来决定是否将该路由对应的组件包裹在keep - alive
中。如果keepAlive
为false
,则该组件不会被keep - alive
缓存,其原理也是利用keep - alive
组件的特性,只有被包裹在keep - alive
内的组件才会被缓存,通过条件判断决定是否包裹,从而控制组件是否被缓存。
- 示例: