Interview AiBox logo

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

download免费下载
进阶local_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

相关题目

Vue的响应式原理是什么?

Vue的响应式原理是其核心特性,通过数据劫持和依赖收集实现数据变化自动更新视图。Vue 2.x使用Object.defineProperty实现响应式,存在无法检测对象属性添加/删除和数组索引/长度变化的限制。Vue 3.x使用Proxy解决了这些限制,支持动态属性添加、数组变化检测和Map/Set等数据结构。两者都基于依赖收集(Dep)和观察者(Watcher)模式,但Vue 3.x性能更好且功能更强大。理解响应式原理对高效开发Vue应用至关重要。

arrow_forward

Vue2和Vue3有哪些主要区别?

Vue3相比Vue2是一次重大升级,主要区别包括:1)性能优化:重写虚拟DOM、编译优化、更小包体积;2)响应式系统:使用Proxy替代Object.defineProperty,解决了属性检测限制;3)引入Composition API,提供更灵活的代码组织方式;4)生命周期钩子调整,如beforeDestroy重命名为beforeUnmount;5)支持多根节点组件;6)更好的TypeScript支持;7)新增Teleport、Suspense等特性;8)v-model和全局API的改进。Vue3保持了核心设计理念,提供了更好的开发体验和性能。

arrow_forward

在Vue中,有哪些组件通信的方式?各自适用于什么场景?

Vue提供了多种组件通信方式:1) Props/$emit用于父子组件通信,最基础的方式;2) $refs/$parent/$children实现直接访问,但会增加耦合度;3) EventBus适用于任意组件通信,适合小型项目;4) Vuex/Pinia用于全局状态管理,适合中大型应用;5) provide/inject实现跨级组件通信,避免props逐级传递;6) v-model用于双向绑定,适合表单场景;7) slot通过内容分发通信,适合组件定制;8) mitt是Vue 3的事件总线解决方案;9) Composition API提供逻辑复用机制。选择通信方式需考虑组件关系、数据复杂度、应用规模和Vue版本。

arrow_forward

请做一个自我介绍

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

arrow_forward

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

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

arrow_forward

阅读状态

阅读时长

7 分钟

阅读进度

6%

章节:16 · 已读:0

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

最近更新:2025-08-23

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

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

免费下载download

分享题目

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

外部分享