Vue内置组件:熟悉keep-alive的来龙去脉 - Web前端
作者:98wpeu发布时间:2026-09-07分类:网页前端技术浏览:7

keep-alive是一个抽象组件,它自身不会渲染一个DOM元素,也不会出现在父组件链中;使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
props:
include- 字符串或正则表达式。只有名称匹配的组件会被缓存。exclude- 字符串或正则表达式。任何名称匹配的组件都不会被缓存。max- 数字。最多可以缓存多少组件实例。
用法:
<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 dom 元素,也不会出现在组件的父组件链中。
当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。
在 2.2.0 及其更高版本中,activated 和 deactivated 将会在 <keep-alive> 树内的所有嵌套组件中触发。
主要用于保留组件状态或避免重新渲染。
<!-- 基本 --> <keep-alive> <component :is="view"></component> </keep-alive> <!-- 多个条件判断的子组件 --> <keep-alive> <comp-a v-if="a > 1"></comp-a> <comp-b v-else></comp-b> </keep-alive> <!-- 和 `<transition>` 一起使用 --> <transition> <keep-alive> <component :is="vIEw"></component> </keep-alive> </transition>
注意,
<keep-alive>是用在其一个直属的子组件被开关的情形。如果你在其中有v-for则不会工作。如果有上述的多个条件性的子元素,<keep-alive>要求同时只有一个子元素被渲染。includeandexclude2.1.0 新增
include和excludeprop 允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示:
<!-- 逗号分隔字符串 --> <keep-alive include="a,b"> <component :is="view"></component> </keep-alive> <!-- 正则表达式 (使用 `v-bind`) --> <keep-alive :include="/a|b/"> <component :is="view"></component> </keep-alive> <!-- 数组 (使用 `v-bind`) --> <keep-alive :include="['a', 'b']"> <component :is="view"></component> </keep-alive>
匹配首先检查组件自身的
name选项,如果name选项不可用,则匹配它的局部注册名称 (父组件components选项的键值)。匿名组件不能被匹配。max2.5.0 新增
最多可以缓存多少组件实例。一旦这个数字达到了,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉。
<keep-alive :max="10"> <component :is="view"></component> </keep-alive>
<keep-alive> 不会在函数式组件中正常工作,因为它们没有缓存实例。
keep-alive 生命周期
包含在 keep-alive 中创建的组件,会多出两个生命周期的钩子: activated 与 deactivated。
1. activated
在 keep-alive 组件激活时调用。
在组件第一次渲染时会被调用,之后在每次缓存组件被激活时调用。
第一次进入缓存路由/组件,在mounted后面,beforeRouteEnter守卫传给 next 的回调函数之前调用:
页面第一次进入的时候,钩子触发的顺序是created->mounted->activated
因为组件被缓存了,再次进入缓存路由/组件时,不会触发这些钩子:
beforeCreate created beforemount mounted 都不会触发。
2. deactivated
在 keep-alive 组件停用(离开路由)时调用。
使用了keep-alive就不会调用beforeDestroy(组件销毁前钩子)和destroyed(组件销毁),因为组件没被销毁,被缓存起来了。
这个钩子可以看作beforeDestroy的替代,如果你缓存了组件,要在组件销毁的的时候做一些事情,你可以放在这个钩子里。
注意:
1、 使用 keep-alive 会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在 activated 阶段获取数据,承担原来created钩子函数中获取数据的任务。
2、只有组件被 keep-alive 包裹时,这两个生命周期函数才会被调用,如果作为正常组件使用,是不会被调用的,以及在 2.1.0 版本之后,使用 exclude 排除之后,就算被包裹在 keep-alive 中,这两个钩子函数依然不会被调用!
3、以上这两个钩子函数在服务器端渲染期间不被调用。
实例演练
1.缓存所有页面:
<keep-alive> <router-view></Router-view> <!--这里是会被缓存的组件--> </keep-alive>
2.根据条件缓存部分页面
<template>
<div id="APP">
// 1. 将缓存 name 为 newslist 或者 PRoductList 的组件
<keep-alive include='newsList,productList'>
<router-view/>
</keep-alive>
// 2. 将不缓存 name 为 test 的组件
<keep-alive exclude='test'>
<router-view/>
</keep-alive>
</div>
</template>
<script>
Export default {
name: 'app'
}
</script>注意:
还有一步,你必须在需要被缓存状态的组件的script部分,给组件添加一个name属性。 如果没有使用keep-alive缓存状态的组件,可以不写name属性。但是如果使用了keep-alive缓存该组件状态,则此组件必须有这个属性。并且,这个属性的值,还必须跟标签中include属性的值完全一致,包括大小写。 以productList.Vue组件为例。
<template>
<!-- 这里是productList组件的html结构部分 -->
</template>
<script>
export default {
name: "productList", //如果使用了keep-alive缓存该组件状态,则此组件必须有这个属性。
data(){
return {}
}
</script>3.结合vue-router,缓存部分页面
export default new Router({
mode: 'history',
routes: [
{
path: '/',
name: 'home',
component: Home,
children: [
{
path: 'products',
name: 'products',
component: products,
meta: {
keepAlive: true // 需要缓存
}
},
{
path: 'newsDetAIls',
name: 'newsDetails',
component: newsDetails,
meta: {
keepAlive: false // 不需要缓存
}
}
]
}
]
})在 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>
<script>
export default {
name: 'App'
}
</script>相关推荐
- React中功能组件和类组件之间的区别 - Web前端
- 使用React Hooks和TypeScript - Web前端
- 带大家学习一款很实用的Vue多选列表组件:multiselect - Web前端
- 如何将您的应用程序从Express迁移到Fastify - Web前端
- 如何在MySQL数据库中使用JSON数据字段 - Web前端
- 产品经理为何要学习Web前端编码 - Web前端
- React开发:提交输入框input值的小应用 - Web前端
- 使用现代JavaScript和Web组件构建Web应用程序 - Web前端
- Windows 10:绘画和截图工具现在可以从Microsoft Store更新 - Web前端
- 为什么会报错SyntaxError: JSON.parse: bad parsing? - Web前端
- 网页前端技术排行
-
- 1[Web前端]用javascript实现默认图片替代未显示的图片 - Web前端
- 2分析Iconfont-阿里巴巴矢量常用图标库 - Web前端
- 3jQuery实例教程:制作网页中可折叠的面板 - Web前端
- 4【第六章】Foundation之按钮和下拉功能 - Web前端
- 5基于jquery的滚动条滚动固定div(附演示下载) - Web前端
- 6jQuery编写widget的一些技巧分享 - Web前端
- 7分享精心挑选的12款优秀jQuery Ajax分页插件和教程 - Web前端
- 8在Mac/PC上远程调试iPhone/iPad上的网页 - Web前端
- 9jQuery实现鼠标移到元素上动态提示消息框效果 - Web前端
- 最近发表
-
- WordPress随机显示特色图片插件:Random Post Thumbnails
- KeePass实现Chrome浏览器自动填充密码方法一
- LNMP一键包nginx 301强制跳转到https教程
- KeePass实现Chrome浏览器自动填充密码方法二
- #建站# 免费的VPS管理软件Xshell8/Xftp8中文版下载
- 使用Xshell 8连接VPS教程_电脑登录vps的方法
- WordPress评论界面添加烟花????效果
- 不同浏览器书签同步方案:坚果云+Floccus_详细使用教程
- iOS端KeePassXC客户端APP:Strongbox Password Safe
- 给WordPress评论中的Gravatar头像图片添加ALT属性


