口试之《vue keep-alive原理》

[复制链接]
发表于 2025-10-17 18:58:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
keep-alive 是 Vue.js 提供的一个内置组件,用于缓存动态组件,制止组件在切换时重复创建和烧毁,从而提升应用的性能。下面具体先容其缓存组件的原理:
团体原理概述

keep-alive 会在内部维护一个缓存对象(cache)和一个键(keys)数组。当组件被包裹在 keep-alive 中并初次渲染时,keep-alive 会将该组件实例缓存起来,并记载其对应的键。当再次须要渲染该组件时,keep-alive 会从缓存中取出该组件实例,而不是重新创建一个新的实例,如许就制止了组件的重新渲染,进步了性能。
具体工作流程

1. 初始化阶段

当 Vue 实例创建时,如果碰到 keep-alive 组件,会对其举行初始化。在这个过程中,会创建一个 cache 对象和一个 keys 数组,用于存储缓存的组件实例和对应的键。以下是简化的代码示例:
  1. export default {
  2.   name: 'keep-alive',
  3.   abstract: true, // 标记为抽象组件,不会渲染成真实 DOM
  4.   data() {
  5.     return {
  6.       cache: Object.create(null),
  7.       keys: []
  8.     };
  9.   },
  10.   // ...
  11. };
复制代码
2. 渲染组件时

当 keep-alive 包裹的组件须要渲染时,会实验以下步调:

  • 天生组件的键:根据组件的 name 或 tag 等信息天生一个唯一的键。
  • 查抄缓存:查抄 cache 对象中是否已经存在该键对应的组件实例。

    • 如果存在(掷中缓存):从 cache 中取出该组件实例,并将其对应的键移动到 keys 数组的末端,表现该组件是近来使用的。然后直接使用缓存的组件实例举行渲染,跳过组件的创建和挂载过程。
    • 如果不存在(未掷中缓存):正常创建和挂载该组件实例,并将其缓存到 cache 对象中,同时将对应的键添加到 keys 数组中。如果 keys 数组的长度凌驾了 max 属性指定的最大缓存数量(如果设置了 max),则会移除 keys 数组中最旧的键对应的组件实例,以开释缓存空间。

以下是简化的渲染逻辑代码示例:
  1. render() {
  2.   const vnode = getFirstComponentChild(this.$slots.default); // 获取第一个子组件
  3.   const componentOptions = vnode && vnode.componentOptions;
  4.   if (componentOptions) {
  5.     const key = vnode.key == null
  6.       ? componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '')
  7.       : vnode.key;
  8.     if (this.cache[key]) {
  9.       // 命中缓存
  10.       vnode.componentInstance = this.cache[key].componentInstance;
  11.       // 将键移动到 keys 数组末尾
  12.       remove(this.keys, key);
  13.       this.keys.push(key);
  14.     } else {
  15.       // 未命中缓存
  16.       this.cache[key] = vnode;
  17.       this.keys.push(key);
  18.       // 检查是否超过最大缓存数量
  19.       if (this.max && this.keys.length > parseInt(this.max)) {
  20.         pruneCacheEntry(this.cache, this.keys[0], this.keys, this._vnode);
  21.       }
  22.     }
  23.   }
  24.   return vnode;
  25. }
复制代码
3. 组件烧毁时

当 keep-alive 包裹的组件被移除时,由于组件被缓存了,并不会真正烧毁,而是进入一种“停用”状态。此时,组件的 deactivated 生命周期钩子会被调用。当再次渲染该组件时,会进入“激活”状态,组件的 activated 生命周期钩子会被调用。
总结

keep-alive 通过维护一个缓存对象和键数组,实现了组件的缓存和复用。在组件渲染时,优先从缓存中获取组件实例,制止了重复创建和烧毁,同时使用 activated 和 deactivated 生命周期钩子来处理惩罚组件的激活和停用状态,从而提升了应用的性能和用户体验。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表