当前位置:首页 > VUE

vue keep alive实现

2026-03-28 23:44:14VUE

Vue Keep-Alive 实现

Vue 的 keep-alive 是一个内置组件,用于缓存动态组件或路由组件的状态,避免重复渲染和销毁,提升性能。以下是其实现方式和常见用法。

基本用法

keep-alive 可以包裹动态组件或路由组件,缓存其状态:

<template>
  <keep-alive>
    <component :is="currentComponent"></component>
  </keep-alive>
</template>

或用于缓存路由组件:

<template>
  <keep-alive>
    <router-view></router-view>
  </keep-alive>
</template>

缓存特定组件

通过 includeexclude 属性指定需要缓存或排除缓存的组件:

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

includeexclude 可以接受字符串、正则表达式或数组形式。

生命周期钩子

keep-alive 缓存的组件会触发特定的生命周期钩子:

  • activated:组件被激活时调用(从缓存中重新显示)。
  • deactivated:组件被停用时调用(进入缓存)。
export default {
  activated() {
    console.log('组件被激活');
  },
  deactivated() {
    console.log('组件被停用');
  }
};

结合路由使用

在 Vue Router 中,可以通过路由的 meta 字段控制缓存:

const routes = [
  {
    path: '/page-a',
    component: PageA,
    meta: { keepAlive: true }
  },
  {
    path: '/page-b',
    component: PageB,
    meta: { keepAlive: false }
  }
];

在模板中动态判断是否缓存:

<template>
  <keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
  </keep-alive>
  <router-view v-if="!$route.meta.keepAlive"></router-view>
</template>

实现原理

keep-alive 的核心实现逻辑:

  1. 通过插槽获取子组件实例。
  2. 使用缓存对象(如 cache)存储组件实例。
  3. 通过 includeexclude 过滤需要缓存的组件。
  4. 在组件切换时,将非活跃组件从 DOM 中移除(但保留实例),后续直接从缓存中恢复。

源码关键逻辑(简化版):

vue keep alive实现

const cache = Object.create(null);

export default {
  render() {
    const slot = this.$slots.default;
    const vnode = slot[0];
    const key = vnode.key;

    if (cache[key]) {
      vnode.componentInstance = cache[key].componentInstance;
    } else {
      cache[key] = vnode;
    }

    return vnode;
  }
};

注意事项

  • 缓存的组件会占用内存,需合理控制缓存数量。
  • 动态组件切换时,v-ifkeep-alive 可能冲突,需注意逻辑顺序。
  • 组件需有唯一的 key 属性,否则缓存可能失效。

通过合理使用 keep-alive,可以显著提升 Vue 应用的性能和用户体验。

标签: vuekeep
分享给朋友:

相关文章

javascript实现vue

javascript实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,主要包括数据绑定、响应式系统和虚拟 DOM。以下是一个简化的实现示例。 数据响应式系统 通过 Object.de…

vue实现尺子

vue实现尺子

Vue 实现尺子组件 实现一个尺子组件可以通过 Canvas 或纯 CSS 完成。以下是两种常见实现方式: 使用 Canvas 绘制尺子 通过 Canvas 动态绘制刻度线和数字,适合需要高精度或动…

vue实现select

vue实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过多种方式完成,以下是几种常见的方法: 使用原生 HTML select 元素 原生 HTML 的 <sel…

vue实现双击

vue实现双击

Vue 实现双击事件的方法 在Vue中实现双击事件可以通过以下几种方式完成,具体选择取决于项目需求和开发习惯。 使用 @dblclick 指令 Vue提供了内置的@dblclick指令,可以直接在模…

vue实现layout

vue实现layout

Vue 实现 Layout 布局的方法 在 Vue 中实现 Layout 布局通常涉及路由嵌套、组件化设计和动态渲染。以下是几种常见的实现方式: 使用嵌套路由 通过 Vue Router 的嵌套路由…

vue实现首页

vue实现首页

Vue 实现首页的基本步骤 安装 Vue.js 和相关依赖,可以通过 Vue CLI 或 Vite 快速初始化项目。Vue CLI 适合传统项目,Vite 更适合现代前端开发。 npm instal…