Vue keepalive学习用法及场景分析

 更新时间:2025年03月21日 11:49:32   作者:前端熊猫  
在Vue中,<keep-alive>的include属性用于指定需要缓存的组件,本文给大家介绍Vue keepalive学习用法及场景分析,感兴趣的朋友一起看看吧

在Vue中,<keep-alive>include属性用于指定需要缓存的组件,其实现方式如下:

1. 基本用法

字符串形式:通过逗号分隔组件名称,匹配到的组件会被缓存。

<keep-alive include="ComponentA,ComponentB">
  <component :is="currentComponent"></component>
</keep-alive>

此时仅缓存名称为ComponentAComponentB的组件。

正则表达式:使用v-bind动态绑定正则表达式,匹配组件名称。

<keep-alive :include="/Component[A-Z]/">
  <component :is="currentComponent"></component>
</keep-alive>

此时匹配名称以Component开头且后续为大写字母的组件。

数组形式:通过数组动态指定缓存组件。

<keep-alive :include="['ComponentA', 'ComponentB']">
  <component :is="currentComponent"></component>
</keep-alive>

支持动态计算属性返回数组,例如结合路由元信息。

2. 动态控制缓存

结合路由元信息:在路由配置中通过meta字段标记需缓存的组件,再通过计算属性动态生成include值。

// 路由配置
const routes = [
  { path: '/pageA', component: PageA, meta: { keepAlive: true } },
  { path: '/pageB', component: PageB, meta: { keepAlive: false } }
];
// 动态include
<keep-alive :include="cachedComponents">
  <router-view></router-view>
</keep-alive>
computed: {
  cachedComponents() {
    return this.$route.matched
      .filter(route => route.meta.keepAlive)
      .map(route => route.name);
  }
}

此方式通过路由元信息灵活控制缓存。

3. 注意事项

• 组件需设置name属性:include通过组件名称匹配,因此被缓存组件必须显式定义name属性。
• 优先级:若同时存在includeexcludeexclude的优先级更高。例如:

<keep-alive include="A,B" exclude="B">
  <component :is="currentComponent"></component>
</keep-alive>

此时仅缓存组件A,因B被排除。

4. 生命周期钩子

被缓存的组件会触发activated(激活时)和deactivated(停用时)钩子,而非createdmounted,需在对应钩子中处理状态更新。

1. <keep-alive> 的生命周期流程

当组件被包裹在 <keep-alive> 内时,其生命周期会分为以下阶段:

阶段触发条件回调钩子行为说明
初次进入组件首次被渲染created, mounted正常初始化,执行逻辑
切换至其他组件组件被切换到非活动状态deactivated停用回调,保存状态或清理资源
再次被激活组件重新进入活动状态activated激活回调,恢复状态或刷新数据
组件销毁缓存达到 max 限制或手动销毁destroyed销毁组件实例,释放内存

2. 关键生命周期钩子详解

(1) activated 钩子

触发时机:组件从缓存中被重新激活时(例如用户返回到该页面)。
典型用途
• 加载最新数据(例如从服务端获取)。
• 恢复动态修改的 DOM 状态(如滚动位置、定时器)。
• 更新组件内部状态(如重置表单或重新计算数据)。
示例

export default {
  activated() {
    console.log('组件被激活');
    this.fetchData(); // 刷新数据
    this.initTimer(); // 重启定时器
  },
};

(2) deactivated 钩子

触发时机:组件被切换到缓存中(例如用户跳转到其他页面)。
典型用途
• 取消定时器或异步操作,避免内存泄漏。
• 保存当前状态到本地存储或 Vuex。
• 暂停动画或视频播放。
示例

export default {
  deactivated() {
    console.log('组件被停用');
    clearInterval(this.timer); // 清除定时器
    this.saveScrollPosition(); // 保存滚动位置
  },
};

(3) destroyed 钩子

触发时机:当组件被彻底销毁时(例如缓存满后被移除,或调用 $destroy())。
典型用途
• 释放强引用资源(如 WebSocket 连接)。
• 清理全局事件监听器。
注意:仅在组件被销毁时触发,缓存中的组件不会触发此钩子

3. 生命周期对比(普通组件 vs <keep-alive> 组件)

钩子普通组件<keep-alive> 组件
created✅(仅第一次初始化时触发)
mounted✅(仅第一次初始化时触发)
updated
deactivated✅(停用时触发)
activated✅(激活时触发)
destroyed✅(组件销毁时触发)✅(缓存超限或手动销毁时触发)

4. 实际应用场景

场景 1:页面切换时保留滚动位置

export default {
  data() {
    return { scrollY: 0 };
  },
  activated() {
    // 恢复滚动位置
    window.scrollTo(0, this.scrollY);
  },
  deactivated() {
    // 保存滚动位置
    this.scrollY = window.scrollY;
  },
};

场景 2:列表页滚动加载数据

export default {
  data() {
    return { page: 1, loading: false };
  },
  activated() {
    if (!this.loading) {
      this.fetchMoreData(); // 刷新数据
    }
  },
};

5. 注意事项

状态管理
• 缓存组件不会销毁实例,因此需谨慎处理状态(如避免重复请求数据)。
• 推荐结合 Vuex 或本地存储管理全局状态。

性能优化
• 使用 max 属性限制缓存数量,避免内存占用过高。
• 在 deactivated 中清理不必要的资源(如定时器、事件监听)。

组件名匹配
• 确保被缓存的组件显式声明了 name 属性(include/exclude 依赖组件名匹配)。

总结

<keep-alive> 的生命周期机制通过 activateddeactivated 钩子,实现了组件状态的暂停与恢复

到此这篇关于Vue keepalive学习用法的文章就介绍到这了,更多相关Vue keepalive用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue3中createWebHistory和createWebHashHistory的区别详析

    Vue3中createWebHistory和createWebHashHistory的区别详析

    这篇文章主要给大家介绍了关于Vue3中createWebHistory和createWebHashHistory区别的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-06-06
  • 解决vue net :ERR_CONNECTION_REFUSED报错问题

    解决vue net :ERR_CONNECTION_REFUSED报错问题

    这篇文章主要介绍了解决vue net :ERR_CONNECTION_REFUSED报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue中数据不响应的问题及解决

    vue中数据不响应的问题及解决

    这篇文章主要介绍了vue中数据不响应的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • vue项目纯前端实现的模板打印功能示例代码

    vue项目纯前端实现的模板打印功能示例代码

    在Vue项目中,通过使用vue-print-nb插件,可以实现页面的打印功能,这篇文章主要介绍了vue项目纯前端实现的模板打印功能的相关资料,需要的朋友可以参考下
    2024-10-10
  • vue中el-table树状表格末行合计实现

    vue中el-table树状表格末行合计实现

    本文主要介绍了vue中el-table树状表格末行合计实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • vue 监听屏幕高度的实例

    vue 监听屏幕高度的实例

    今天小编就为大家分享一篇vue 监听屏幕高度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 关于Vue的URL转跳与参数传递方式

    关于Vue的URL转跳与参数传递方式

    这篇文章主要介绍了关于Vue的URL转跳与参数传递方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Vue设置别名联想路径即@/生效的方法

    Vue设置别名联想路径即@/生效的方法

    这篇文章主要给大家介绍了Vue设置别名联想路径即@/生效的方法,文中有详细的代码示例和图文讲解,具有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • Vue实现星级评价效果实例详解

    Vue实现星级评价效果实例详解

    这篇文章主要介绍了Vue实现星级评价效果的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Vue中Vue-Baidu-Map基本使用方法实例

    Vue中Vue-Baidu-Map基本使用方法实例

    最近有一个项目需要用到地图来展示位置并进行数据交互,用vue-baidu-map实现出来,下面这篇文章主要给大家介绍了关于Vue中Vue-Baidu-Map基本使用的相关资料,需要的朋友可以参考下
    2023-03-03

最新评论