前言

官方介绍文档

官方使用文档

vue生命周期详细图解版.png

钩子函数详解

每个 Vue 实例在被创建时都要经过一系列的初始化过程(设置数据监听、编译模板、挂载实例到 DOM、数据变化时更新 DOM 等)。在这个过程中会运行一些叫做生命周期钩子的函数,让开发者有机会在特定阶段加入自己的代码。

Vue2 共有 8 个生命周期钩子:

钩子 触发时机 注意点
beforeCreate 实例初始化之后、数据观测与事件配置之前 不能访问 datamethods
created 实例创建完成后,数据观测、属性和方法的运算完成 可以访问 datamethods,常用于请求数据
beforeMount 挂载开始之前,模板已编译完成 尚未渲染到页面,DOM 未生成
mounted 实例挂载完成,模板已渲染为真实 DOM 可以操作 DOM,常用于初始化插件
beforeUpdate 数据发生变化、DOM 重新渲染之前 可在更新前访问旧 DOM 状态
updated 数据更新导致 DOM 重新渲染完成后 注意避免在此修改数据,可能造成死循环
beforeDestroy 实例销毁之前 此时实例仍可用
destroyed 实例销毁完成后 常用于清理定时器、解绑事件

示例代码

1
<div id="app">{{ msg }}</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
new Vue({
el: "#app",
data: {
msg: "Hello Vue",
},
beforeCreate() {
console.log("beforeCreate: 数据还没准备好", this.msg); // undefined
},
created() {
console.log("created: 数据已就绪", this.msg); // Hello Vue
},
beforeMount() {
console.log("beforeMount: 页面还未渲染");
},
mounted() {
console.log("mounted: 页面已渲染");
},
beforeDestroy() {
console.log("beforeDestroy: 实例销毁前,可以做清理工作");
},
destroyed() {
console.log("destroyed: 实例已销毁");
},
});

使用场景总结

  • created:发起 AJAX 请求获取初始化数据(此时 DOM 未生成,但数据可用)
  • mounted:初始化 DOM 相关的第三方库(如 echarts、Swiper、地图)
  • beforeDestroy:清除定时器、解绑事件监听、销毁组件实例,避免内存泄漏
1
2
3
4
5
6
7
8
mounted() {
this.timer = setInterval(() => {
console.log("定时器执行中");
}, 1000);
},
beforeDestroy() {
clearInterval(this.timer); // 销毁前清除定时器
}

如果组件使用了 <keep-alive> 缓存,还会额外触发 activated(组件被激活)和 deactivated(组件被停用)两个钩子。