🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
💬 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
文章目录
一、keep - alive
组件概述
- 定义与作用
keep - alive
是Vue.js中的一个内置组件,用于缓存动态组件。它能够在组件切换过程中,将被切换掉的组件实例保存在内存中,而不是直接销毁。当再次切换回这个组件时,可以直接从缓存中取出组件实例进行渲染,避免了重新创建组件实例和重新渲染的过程,从而提高了应用的性能。
- 使用场景示例
- 例如,在一个多标签页的应用中,当用户在不同的标签页(每个标签页对应一个组件)之间切换时,如果没有
keep - alive
组件,每次切换标签页都会重新创建和销毁组件。而使用keep - alive
组件,可以缓存这些组件,使得用户再次访问某个标签页时,能够快速显示之前的内容,提供更流畅的用户体验。
- 例如,在一个多标签页的应用中,当用户在不同的标签页(每个标签页对应一个组件)之间切换时,如果没有
二、keep - alive
组件的基本用法
- 包裹动态组件
- 在Vue模板中,
keep - alive
组件通过将动态组件包裹在其内部来实现缓存功能。例如,使用component
标签来实现动态组件加载,keep - alive
组件可以这样使用:
<keep - alive> <component :is="currentComponent"></component> </keep - alive>
- 其中,
currentComponent
是一个变量,它的值决定了当前要显示的组件。通过这种方式,keep - alive
组件会缓存component
标签所渲染的动态组件。
- 在Vue模板中,
- 包含多个条件渲染组件(v - if/v - else)
- 也可以用于缓存多个通过条件渲染的组件。例如:
<keep - alive> <template v - if="showComponentA"> <ComponentA /> </template> <template v - else - if="showComponentB"> <ComponentB /> </template> <template v - else> <ComponentC /> </template> </keep - alive>
- 当
showComponentA
、showComponentB
或showComponentC
的值发生变化时,对应的组件在切换过程中会被keep - alive
组件缓存。
三、keep - alive
组件的生命周期钩子变化
activated
和deactivated
钩子- 当一个组件被
keep - alive
缓存后,它的生命周期钩子会发生一些变化。组件在被激活(从缓存中取出并重新显示)时,会触发activated
钩子。这个钩子可以用于执行一些在组件重新显示时需要进行的操作,比如重新获取数据、重新启动动画等。 - 例如:
export default { activated() { // 重新获取数据 this.fetchData(); }, methods: { fetchData() { // 发送请求获取数据 } } };
- 相反,当组件被切换掉并放入缓存时,会触发
deactivated
钩子。这个钩子可以用于清理一些在组件不显示时不需要的资源,比如停止定时器、取消网络请求等。例如:
export default { deactivated() { // 停止定时器 clearInterval(this.timer); }, data() { return { timer: null }; }, mounted() { // 启动定时器 this.timer = setInterval(() => { // 执行一些操作 }, 1000); } };
- 当一个组件被
四、keep - alive
组件的属性
include
属性include
属性用于指定哪些组件应该被缓存。它可以接受一个字符串、一个正则表达式或者一个数组。- 字符串形式:如果是字符串,它应该是组件的名称(通过
name
选项定义)。例如,如果有一个组件MyComponent
,它的name
定义为'MyComponent'
,可以这样使用include
属性:
<keep - alive include="MyComponent"> <component :is="currentComponent"></component> </keep - alive>
- 只有名称为
MyComponent
的组件会被缓存。 - 正则表达式形式:如果是正则表达式,那么组件名称匹配该正则表达式的组件会被缓存。例如:
<keep - alive :include="/^My/"> <component :is="currentComponent"></component> </keep - alive>
- 名称以
My
开头的组件会被缓存。 - 数组形式:如果是数组,数组中的元素是组件名称,这些组件会被缓存。例如:
<keep - alive :include="['MyComponent1', 'MyComponent2']"> <component :is="currentComponent"></component> </keep - alive>
- 名称为
MyComponent1
和MyComponent2
的组件会被缓存。
exclude
属性(与include
相反)exclude
属性用于指定哪些组件不应该被缓存。它的使用方式和include
属性类似,也可以接受字符串、正则表达式或者数组。例如:
<keep - alive exclude="ComponentNotToCache"> <component :is="currentComponent"></component> </keep - alive>
- 名称为
ComponentNotToCache
的组件不会被缓存,其他组件会被缓存。
五、keep - alive
组件在性能优化中的重要性
- 减少组件重新创建和渲染的开销
- 在复杂的单页应用中,组件的重新创建和渲染可能会涉及到大量的数据获取、计算和DOM操作。
keep - alive
组件通过缓存组件实例,大大减少了这些开销。例如,一个包含多个图表组件的数据分析应用,当用户在不同的图表视图之间切换时,使用keep - alive
可以避免重新绘制图表,节省了时间和计算资源。
- 在复杂的单页应用中,组件的重新创建和渲染可能会涉及到大量的数据获取、计算和DOM操作。
- 提升用户体验的连贯性
- 缓存组件可以让用户在切换组件时,感受到更快的响应速度。因为组件的状态和内容能够快速恢复,而不是经历一个重新加载的过程。这在移动应用或者对性能敏感的应用中尤为重要,能够提供更流畅的用户交互体验。