Vue 实例在被创建时,会经过一系列的初始化过程,初始化过程中会运行一些函数,叫做生命周期钩子函数,通过运用钩子函数,用户在可以在Vue实例初始化的不同阶段添加自己的代码,以此来实现自己想做的事情。
以下图中标红的圆角矩形均为钩子函数,除此之外,vue高级版本还新增了一些钩子函数。
函数名称 | 版本 | 说明 |
---|---|---|
beforeCreate | 2.0+ | vue实例创建初始化后,数据观测 (data observer) 和event/watch事件配置之前触发 |
created | 2.0+ | 在实例创建完成后被立即调用,此时实例已完成数据观测 (data observer),属性方法的运算,watch/event 事件回调的配置。然而,挂载阶段还没开始,$el 属性目前不可见 |
beforeMount | 2.0+ | 实例挂载开始之前被调用, render 函数首次被调用,该钩子在服务器端渲染期间不被调用 |
mounted | 2.0+ | 实例已挂载。mounted 不会承诺所有的子组件也都一起被挂载,如果你希望等到整个视图都渲染完毕再进行一些操作,请用 vm.$nextTick:mounted: function () {this.$nextTick(function () { // Code that will run only after the entire view has been rendered })}该钩子在服务器端渲染期间不被调用 |
beforeUpdate | 2.0+ | 数据更新时调用,发生在虚拟 DOM 打补丁之前,这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器,该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行 |
updated | 2.0+ | 数据更改会导致虚拟 DOM 重新渲染和打补丁,在这之后会调用updated钩子。updated 不会承诺所有的子组件也都一起被重绘。如果你希望等到整个视图都重绘完毕,请用 vm.$nextTick :updated: function () {this.$nextTick(function () { // Code that will run only after the entire view has been re-rendere})} updated钩子被调用时,组件 DOM 已经更新,你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改实例中的状态属性,如果要相应状态改变,通常最好使用计算属性或 watcher |
beforeDestroy | 2.0+ | 实例销毁之前调用。在这一步,实例仍然完全可用,该钩子在服务器端渲染期间不被调用 |
destroyed | 2.0+ | Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会接触绑定,所有的事件监听器会被移除,所有的子实例也会被销毁,该钩子在服务器端渲染期间不被调用 |
activated | 2.0+ | 当某个组件使用了keep-alive组件缓存时,该组件激活时调用activated钩子,该钩子在服务器端渲染期间不被调用 |
deactivated | 2.0+ | 当某个组件使用了keep-alive组件缓存时,该组件停用时调用deactivated钩子,该钩子在服务器端渲染期间不被调用 |
errorCaptured | 2.5.0+ | 当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播 |
<div>/{/{test/}/}</div>
data() {
return {
test:'hello world'
}
},
methods:{
hello(){
alert('hello')
}
}
beforeCreate() {
console.log('beforeCreate 钩子函数被调用')
this.hello()
console.log("%c%s", "color:green" , "el : " + this.$el) //undefined
console.log("%c%s", "color:green","data : " + this.$data) //undefined
console.log("%c%s", "color:green","test: " + this.test) //undefined
console.log("-----------------------");
}
beforeCreate
钩子调用时,$el
和$data
均未被初始化,methods
和watch
里的方法事件均未被初始化,在这里没什么事情可做,你可以在这时候加个loading动画
created() {
console.log('created 钩子函数被调用')
console.log("%c%s", "color:green" , "el : " + this.$el) //undefined
console.log("%c%s", "color:green","data : " + this.$data) //已被初始化
console.log(this.$data) //已被初始化
console.log("%c%s", "color:green","test: " + this.test) //已被初始化
this.hello()
console.log("-----------------------")
}
created
钩子调用时,进行挂载数据,绑定事件。$data
,methods
,watch
此时被初始化了,可以访问data
中相关属性和methods
,watch
的方法事件,但是$el
属性仍然不可见。
一般可以在这里做初始数据的获取,在这里更改data
的数据不会触发 updated
钩子。
beforeMount() {
console.log('beforeMount 钩子函数被调用')
console.log("%c%s", "color:green" , "el : " + this.$el) //undefined
console.log(this.$el) //undefined
console.log("%c%s", "color:green","data : " + this.$data) //已被初始化
console.log(this.$data) //已被初始化
console.log("%c%s", "color:green","test: " + this.test) //已被初始化
console.log("-----------------------")
}
beforeMount
钩子调用时,开始找实例或者组件对应的模板,编译模板为虚拟 dom 放入到render
函数中准备渲染,此时DOM还是无法操作,$el
属性仍然不可见。
一般可以在这里做初始数据的获取,在这里更改data
的数据不会触发 updated
钩子。
console.log('mounted 钩子函数被调用')
console.log("%c%s", "color:green" , "el : " + this.$el) //已被初始化
console.log("%c%s", "color:green","data : " + this.$data) //已被初始化
console.log(this.$data) //已被初始化
console.log("%c%s", "color:green","test: " + this.test) //已被初始化
console.log("-----------------------")
mounted
钩子调用时,开始执行render
,渲染出真实dom,$el
属性可见,在这里操作真实的dom,依赖于DOM的代码请放在此处。
mounted () {
this.test = 'goodbye world'
},
beforeUpdate() {
console.log('beforeUpdate钩子函数被调用')
console.log("%c%s", "color:green" , "el : " + this.$el) //已被初始化
console.log(this.$el) //已被初始化
console.log("%c%s", "color:green","data : " + this.$data) //已被初始化
console.log(this.$data) //已被初始化
console.log("%c%s", "color:green","test: " + this.test) //已被初始化
console.log("-----------------------")
}
data
发生变化时,在虚拟DOM更新补丁之前,beforeUpdate
钩子被调用,这里适合在更新之前访问数据未被改变的 DOM。
mounted () {
this.test = 'goodbye world'
},
updated() {
console.log('updated钩子函数被调用')
console.log("%c%s", "color:green" , "el : " + this.$el) //已被初始化
console.log(this.$el) //已被初始化
console.log("%c%s", "color:green","data : " + this.$data) //已被初始化
console.log(this.$data) //已被初始化
console.log("%c%s", "color:green","test: " + this.test) //已被初始化
console.log("-----------------------")
}
data
更改会导致虚拟 DOM 重新渲染和打补丁,此时调用updated
钩子,这里可以访问数据更新之后的DOM
updated () {
this.$destroy()
},
beforeDestroy () {
console.log('beforeDestroy钩子函数被调用')
console.log('%c%s', 'color:green', 'el : ' + this.$el) // undefined
console.log('%c%s', 'color:green', 'data : ' + this.$data) // undefined
console.log('%c%s', 'color:green', 'test: ' + this.test) // undefined
this.test = 'love world'
this.hello()
console.log('%c%s', 'color:green', 'test: ' + this.test) // undefined
console.log('-----------------------')
}
$destroy()
完全销毁一个实例。清理它与其它实例的连接,解绑它的全部指令及事件监听器。触发beforeDestroy
和destroyed
的钩子。
执行$destroy()
之后,在实例或组件被销毁之前,beforeDestroy
钩子被调用,此时实例仍然可用,在此钩子中调用methods
中的事件,仍然会执行
updated () {
this.$destroy()
},
destroyed () {
console.log('destroyed钩子函数被调用')
console.log('%c%s', 'color:green', 'el : ' + this.$el) // undefined
console.log('%c%s', 'color:green', 'data : ' + this.$data) // undefined
console.log('%c%s', 'color:green', 'test: ' + this.test) // undefined
this.hello()
this.test = 'hi world'
console.log('%c%s', 'color:green', 'test: ' + this.test) // undefined
console.log('-----------------------')
}
destroyed
在实例被销毁之后调用,此时,实例已完全被销毁,与其他实例的连接会被清理,指令和事件均会被解绑
//App.vue
<keep-alive exclude="HelloWorld">
<router-view/>
</keep-alive>
activated () {
console.log('activated钩子函数被调用')
}
首页HelloWorld
不设置缓存,query
设置缓存,当路由从HelloWorld
跳转至query
,缓存组件被激活,调用activated
钩子
//App.vue
<keep-alive exclude="HelloWorld">
<router-view/>
</keep-alive>
deactivated () {
console.log('deactivated钩子函数被调用')
}
首页HelloWorld
不设置缓存,query
设置缓存,当路由从query
跳转至HelloWorld
,缓存组件被停用,调用deactivated
钩子
errorCaptured (err, vm, info) {
console.log(err)
console.log(vm)
console.log(info)
}
errorCaptured
是组件的一个钩子函数,用于在组件级别捕获异常。当这个钩子函数返回 false
时,会阻止异常进一步向上冒泡,否则会不断向父组件传递。