Interview AiBoxInterview AiBox 实时 AI 助手,让你自信应答每一场面试
请列举Vue 2的生命周期钩子函数,并解释每个钩子的执行时机和适用场景。
题型摘要
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 生命周期流程图
生命周期钩子函数详解
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 | 可用 | 可用 | 缓存组件停用时保存状态 |
父子组件生命周期执行顺序
最佳实践
-
created vs mounted:
- 在 created 中进行数据请求,可以更快获取数据,提高首屏渲染速度
- 在 mounted 中进行DOM操作和第三方库初始化
-
避免在 updated 和 beforeUpdate 中修改数据:
- 可能会导致无限循环的更新
- 如果必须修改,使用条件判断确保不会造成循环
-
清理工作:
- 在 beforeDestroy 中进行清理工作,如清除定时器、解绑事件等
- 防止内存泄漏
-
keep-alive 组件:
- 使用 activated 和 deactivated 钩子处理缓存组件的特殊逻辑
- 在 activated 中获取最新数据,而不是在 created 中
-
性能优化:
- 避免在生命周期钩子中进行大量计算
- 可以使用计算属性或方法来替代
参考资料
思维导图
Interview AiBoxInterview 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缓存的组件。父子组件生命周期执行顺序有特定规律,遵循父先创建、子先销毁的原则。
智能总结
深度解读
考点定位
思路启发
相关题目
Vue的响应式原理是什么?
Vue的响应式原理是其核心特性,通过数据劫持和依赖收集实现数据变化自动更新视图。Vue 2.x使用Object.defineProperty实现响应式,存在无法检测对象属性添加/删除和数组索引/长度变化的限制。Vue 3.x使用Proxy解决了这些限制,支持动态属性添加、数组变化检测和Map/Set等数据结构。两者都基于依赖收集(Dep)和观察者(Watcher)模式,但Vue 3.x性能更好且功能更强大。理解响应式原理对高效开发Vue应用至关重要。
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保持了核心设计理念,提供了更好的开发体验和性能。
在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版本。
请做一个自我介绍
自我介绍是面试的开场环节,应遵循"三段式"结构:基本信息与教育背景、核心能力与项目经验、求职动机与个人特质。重点突出与岗位相关的技能和经验,用具体数据和成果支撑,保持真诚自然的表达,控制在2-3分钟内。针对不同公司和岗位进行个性化调整,展示自己的匹配度和价值。
请做一个自我介绍,包括你的技术背景、项目经验和学习方向。
自我介绍应包含四个核心部分:个人背景、技术能力、项目经验和学习规划。技术背景需突出前端技术栈掌握程度;项目经验应选择代表性案例,说明技术实现和个人贡献;学习方向要体现职业规划与公司发展的契合度。整体表达应简洁有力,重点突出,时间控制在3-5分钟内。