“我正在参加「掘金·启航计划」”
1. vue组件生命周期钩子函数介绍
对于生命周期钩子函数的理解,vue作者本人是这样解释的
每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会
简单来说:vue生命周期钩子就是vue从创建到销毁过程中,会执行的一些回调函数
这也类似于人生老病死的过程
2. Vue官网生命周期示意图
3. 生命周期钩子详解
根据vue官网的说明 vue的生命周期钩子可以大致分为四大阶段,8个方法
- 初始化阶段
- 挂载阶段
- 更新阶段
- 销毁阶段
接下来详细介绍一下这四个阶段,观察一下它们分别做了哪些事
初始化阶段
-
beforeCreate
- 初始化vue实例,声明周期函数,事件(不是页面点击事件哈,就是vue本身自带的一些事件)
- 此时创建了 vue 实例,但是还没有创建 el 和 data
-
created
这个钩子非常重要- 初始化data中数据,methods里面的方法
- 此时创建了 data 实例,但是还没有创建 el
- 经典应用 : 页面一加载, ajax请求数据渲染页面。一般写在这个钩子里面
// 初始化阶段
// 1. beforeCreate: 创建vue实例,但是还没有创建el 和 date
beforeCreate () {
console.log('beforeCreate')
console.log(this) // this指向vue实例
console.log(this.name) // undefined
console.log(this.$el) // undefined
},
// 2. created: 创建了 data 但是没有创建 el
// 🎈使用频率极高 最早访问 data 中的数据, 一般在这个钩子中发送ajax请求
created () {
console.log('created')
console.log(this) // this指向vue实例
console.log(this.name) // 张三
console.log(this.$el) // undefined
},
挂载阶段
-
beforeMount
- 这个钩子不常用
- 此时创建了el, 但是还没有把data挂载到el
- 完成el挂载点加载(生成虚拟DOM)
-
mounted
这个钩子很重要- 这是最早可以获取页面DOM元素的钩子
- 虚拟DOM和渲染的数据一并挂到真实DOM上
// 挂载
// 3. beforeMount: 此时创建了el, 但是还没有把data挂载到el
// 不常用: 编译器获取挂载点, 但是还没有挂载,页面看不到数据
beforeMount () {
console.log(3)
console.log(this)
console.log(this.name) // ikun
console.log(this.$el) // template环境,此时看不到$el
console.log(document.querySelector('p')) // null, 此时并没有渲染
},
// 4. mounted: 完成第一次渲染,把data中的数据渲染到$el上
// 🎈常用钩子: 最早可以操作 DOM 的钩子 (页面一进入模拟点击第一个按钮)
mounted () {
console.log(4)
console.log(this)
console.log(this.name) // ikun
console.log(this.$el) // div
},
更新阶段
-
beforeUpdate
- 这个钩子不常用
- 只要 data 中的数据变化 就会执行这个钩子
- 可以获取到更新之后的data,但是还没有渲染到 DOM
-
updated
- 这个钩子不常用
- 完成data渲染(将虚拟DOM渲染成真实DOM),把更新之后的 data 渲染到页面
- 注意点:这两个钩子会执行多次,只要data中数据变化了,就会执行,执行频率较高,性能开销大,不建议使用
// 更新阶段
// 5. beforeUpdate: 检测到data数据发生变化,但是还没有更新el
beforeUpdate () {
console.log('beforeUpdate')
console.log(this) // vue实例
},
// 6. updated: 更新之后的data,完成渲染
updated () {
console.log('updated')
console.log(this) // vue实例
},
销毁阶段
-
before(vue准备销毁)
- 这个钩子有些场景会用到,例如在这个钩子里面移除定时器 clearInterval( )
- 这个钩子准备移除你的组件,移除数据监视器,侦听器等
-
destroyed(已经销毁)
- 解除el 和 data 之间的关联, 以后修改 data ,el 不会更新
// 销毁
// 7. beforeDestroy: vue 准备销毁
beforeDestroy () {
console.log(7)
},
// 8. destroyed: 已经销毁
// 销毁: 解除el 和 data 之间的关联, 以后修改 data ,el 不会更新
destroyed () {
console.log(8)
}
4. vue生命周期钩子注意点
每一个生命周期钩子中的this都是指向vue实例,所以,生命周期钩子不能是箭头函数
5. vue生命周期钩子经典面试题
-
vue生命周期钩子简述:
- vue从初始化到销毁的过程中会执行的函数
-
vue生命周期钩子有哪些阶段?
- 初始化阶段: beforeCreated created
- 挂载阶段: beforeMount mounted
- 更新阶段: beforeUpdate updated
- 销毁阶段: beforeDestroy destroyed
-
vue初始化渲染会执行哪些钩子?
- beforeCreated
- created
- beforeMount
- mounted
-
vue生命周期钩子有哪些是常用的,具体是做什么的?
-
created(): 一般用于发送ajax(页面一加载需要发送ajax在这个钩子)
-
mounted(): 一般用于操作DOM(页面一加载需要操作DOM在这个钩子)
-
-
会执行多次的钩子是哪几个?
- 只有更新阶段的两个钩子会执行多次,其他六个钩子都是执行一次