Interview AiBox logo

Interview AiBox 实时 AI 助手,让你自信应答每一场面试

download免费下载
3local_fire_department40 次面试更新于 2025-08-23account_tree思维导图

请列举Vue 2的生命周期钩子函数,并解释每个钩子的执行时机和适用场景。

lightbulb

题型摘要

Vue 2的生命周期钩子函数包括beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed,以及keep-alive组件特有的activated和deactivated。这些钩子函数在组件不同阶段自动调用,beforeCreate和created阶段实例初始化,beforeMount和mounted阶段DOM挂载,beforeUpdate和updated阶段数据更新,beforeDestroy和destroyed阶段组件销毁。created适合异步请求数据,mounted适合DOM操作,beforeDestroy适合清理工作,activated和deactivated用于keep-alive缓存的组件。父子组件生命周期执行顺序有特定规律,遵循父先创建、子先销毁的原则。

Vue 2 生命周期钩子函数详解

Vue 2 的生命周期是指一个 Vue 实例从创建到销毁的整个过程,在这个过程中提供了一系列的钩子函数,让开发者可以在特定阶段添加自己的代码。

Vue 2 生命周期流程图

--- title: Vue 2 生命周期流程图 --- graph TD A[开始] --> B[beforeCreate] B --> C[created] C --> D[beforeMount] D --> E[mounted] E --> F{数据更新?} F -->|是| G[beforeUpdate] G --> H[updated] H --> F F -->|否| I{组件销毁?} I -->|是| J[beforeDestroy] J --> K[destroyed] K --> L[结束] I -->|否| F M[keep-alive] --> N[activated] N --> O[deactivated] O --> N

生命周期钩子函数详解

1. beforeCreate

执行时机: 实例初始化之后,数据观测(data observer)和事件配置(event/watcher)之前被调用。

适用场景:

  • 此时实例的 data、methods、computed、watch 等都未被初始化,无法访问
  • 可以用于整个应用初始化前的一些预处理工作
  • 通常很少使用这个钩子
beforeCreate() {
  console.log(this.$data); // undefined
  console.log(this.$el);   // undefined
}

2. created

执行时机: 实例已经创建完成之后被调用。此时,实例已经完成以下的配置:数据观测(data observer),属性和方法的运算,watch/event 事件回调。

适用场景:

  • 异步请求获取数据(最常用场景)
  • 对数据进行修改
  • 初始化一些非DOM相关的操作
  • 可以访问 data、props、computed、methods
created() {
  console.log(this.$data); // 已被初始化
  console.log(this.$el);   // undefined
  
  // 异步获取数据
  axios.get('/api/data')
    .then(response => {
      this.data = response.data;
    });
}

3. beforeMount

执行时机: 在挂载开始之前被调用,相关的 render 函数首次被调用。

适用场景:

  • 可以访问到虚拟DOM,但尚未挂载到真实DOM
  • 可以在这里进行一些挂载前的最后修改
  • 一般较少使用
beforeMount() {
  console.log(this.$el); // undefined
}

4. mounted

执行时机: el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。

适用场景:

  • DOM操作(最常用场景)
  • 访问和操作DOM元素
  • 初始化第三方插件(如图表库、轮播图等)
  • 发送AJAX请求(如果created中未发送)
mounted() {
  console.log(this.$el); // 已被挂载
  
  // 初始化图表
  this.chart = echarts.init(this.$refs.chart);
  this.chart.setOption(this.chartOptions);
}

5. beforeUpdate

执行时机: 数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。

适用场景:

  • 在数据更新后,DOM更新前,对现有DOM进行一些修改
  • 可以在这里进一步地更改状态,不会触发附加的重渲染
  • 适合在更新前访问现有的DOM
beforeUpdate() {
  // 可以在DOM更新前获取到DOM的原始状态
  console.log(this.$el.textContent);
}

6. updated

执行时机: 由于数据更改导致的虚拟 DOM 重新渲染和打补丁之后调用。

适用场景:

  • 当数据变化导致DOM重新渲染后,需要执行的操作
  • 避免在此钩子中修改数据,否则可能会导致无限循环的更新
  • 适合执行依赖于更新后DOM的操作
updated() {
  // DOM已更新,可以执行依赖于更新后DOM的操作
  console.log('DOM updated');
}

7. beforeDestroy

执行时机: 实例销毁之前调用。在这一步,实例仍然完全可用。

适用场景:

  • 清理工作(最常用场景)
  • 清除定时器
  • 解绑自定义事件
  • 取消订阅消息
  • 销毁第三方插件实例
beforeDestroy() {
  // 清除定时器
  if (this.timer) {
    clearInterval(this.timer);
  }
  
  // 销毁图表实例
  if (this.chart) {
    this.chart.dispose();
  }
}

8. destroyed

执行时机: Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

适用场景:

  • 执行一些最后的清理工作
  • 通知其他组件该实例已被销毁
  • 通常较少使用,大部分清理工作在beforeDestroy中完成
destroyed() {
  console.log('Component has been destroyed');
}

9. activated

执行时机: 被 keep-alive 缓存的组件激活时调用。

适用场景:

  • keep-alive缓存的组件重新激活时执行
  • 获取最新数据
  • 恢复组件状态
activated() {
  // 组件被重新激活时,获取最新数据
  this.fetchData();
}

10. deactivated

执行时机: 被 keep-alive 缓存的组件停用时调用。

适用场景:

  • keep-alive缓存的组件被停用时执行
  • 保存当前状态
  • 清理一些不需要保留的数据
deactivated() {
  // 组件被停用时,保存当前状态
  this.saveState();
}

生命周期钩子函数使用场景对比

钩子函数 数据状态 DOM状态 常用场景
beforeCreate 未初始化 未创建 应用初始化前的预处理
created 已初始化 未创建 异步获取数据、数据修改
beforeMount 已初始化 未挂载 挂载前的最后修改
mounted 已初始化 已挂载 DOM操作、初始化第三方插件
beforeUpdate 已更新 未更新 更新前访问现有DOM
updated 已更新 已更新 依赖更新后DOM的操作
beforeDestroy 可用 可用 清理定时器、解绑事件
destroyed 不可用 不可用 最终清理工作
activated 可用 可用 缓存组件激活时获取数据
deactivated 可用 可用 缓存组件停用时保存状态

父子组件生命周期执行顺序

--- title: 父子组件生命周期执行顺序 --- sequenceDiagram participant Parent as 父组件 participant Child as 子组件 Parent->>Parent: beforeCreate Parent->>Parent: created Parent->>Parent: beforeMount Parent->>Child: beforeCreate Child->>Child: created Child->>Child: beforeMount Child->>Child: mounted Parent->>Parent: mounted Note over Parent, Child: 数据更新时 Parent->>Parent: beforeUpdate Parent->>Child: beforeUpdate Child->>Child: updated Parent->>Parent: updated Note over Parent, Child: 销毁时 Parent->>Parent: beforeDestroy Parent->>Child: beforeDestroy Child->>Child: destroyed Parent->>Parent: destroyed

最佳实践

  1. created vs mounted:

    • 在 created 中进行数据请求,可以更快获取数据,提高首屏渲染速度
    • 在 mounted 中进行DOM操作和第三方库初始化
  2. 避免在 updated 和 beforeUpdate 中修改数据:

    • 可能会导致无限循环的更新
    • 如果必须修改,使用条件判断确保不会造成循环
  3. 清理工作:

    • 在 beforeDestroy 中进行清理工作,如清除定时器、解绑事件等
    • 防止内存泄漏
  4. keep-alive 组件:

    • 使用 activated 和 deactivated 钩子处理缓存组件的特殊逻辑
    • 在 activated 中获取最新数据,而不是在 created 中
  5. 性能优化:

    • 避免在生命周期钩子中进行大量计算
    • 可以使用计算属性或方法来替代

参考资料

account_tree

思维导图

Interview AiBox logo

Interview AiBox — 面试搭档

不只是准备,更是实时陪练

Interview AiBox 在面试过程中提供实时屏幕提示、AI 模拟面试和智能复盘,让你每一次回答都更有信心。

AI 助读

一键发送到常用 AI

Vue 2的生命周期钩子函数包括beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed,以及keep-alive组件特有的activated和deactivated。这些钩子函数在组件不同阶段自动调用,beforeCreate和created阶段实例初始化,beforeMount和mounted阶段DOM挂载,beforeUpdate和updated阶段数据更新,beforeDestroy和destroyed阶段组件销毁。created适合异步请求数据,mounted适合DOM操作,beforeDestroy适合清理工作,activated和deactivated用于keep-alive缓存的组件。父子组件生命周期执行顺序有特定规律,遵循父先创建、子先销毁的原则。

智能总结

深度解读

考点定位

思路启发

auto_awesome

相关题目

请做一个自我介绍

自我介绍是面试的开场环节,应遵循"三段式"结构:基本信息与教育背景、核心能力与项目经验、求职动机与个人特质。重点突出与岗位相关的技能和经验,用具体数据和成果支撑,保持真诚自然的表达,控制在2-3分钟内。针对不同公司和岗位进行个性化调整,展示自己的匹配度和价值。

arrow_forward

你有什么问题想问我们公司或团队的吗?

面试结尾提问是展示面试者思考深度和职业素养的重要机会。应提前准备3-5个有深度的问题,围绕团队技术、个人成长、公司文化和业务发展四个方面。好的问题能体现你对公司的了解、对职位的重视以及你的职业规划,避免问基础信息类问题。

arrow_forward

请做一个自我介绍

自我介绍应遵循“我是谁-我为什么能胜任-我为什么想来”的逻辑框架。在“能胜任”部分,要通过STAR法则和量化结果来突出技术亮点和项目经验。在“想来”部分,要表达对华为技术、文化或业务的认同,展现匹配度和诚意。整个过程应简洁有力,控制在1-3分钟内。

arrow_forward

请做一个自我介绍

自我介绍是面试的开场环节,应简洁明了地展示个人基本信息、教育背景、项目经验、技术特长、个人特质和求职动机。优秀的自我介绍应结构清晰、重点突出,与应聘岗位高度匹配,并表达出对公司的了解和加入的强烈意愿。

arrow_forward

请做一个自我介绍,包括你的技术背景、项目经验和学习方向。

自我介绍应包含四个核心部分:个人背景、技术能力、项目经验和学习规划。技术背景需突出前端技术栈掌握程度;项目经验应选择代表性案例,说明技术实现和个人贡献;学习方向要体现职业规划与公司发展的契合度。整体表达应简洁有力,重点突出,时间控制在3-5分钟内。

arrow_forward

阅读状态

阅读时长

7 分钟

阅读进度

6%

章节:16 · 已读:0

当前章节: Vue 2 生命周期流程图

最近更新:2025-08-23

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

面试中屏幕实时显示参考回答,帮你打磨表达。

免费下载download

分享题目

复制链接,或一键分享到常用平台

外部分享