Vue 组件生命周期钩子函数
生命周期函数,指的是组件的创建、更新、销毁三个阶段所触发执行的函数。根据每个阶段触发的钩子函数,我们可以相应的做一些操作,如获取后端接口数据、监听事件、执行事件、执行定时器、移除事件、清理定时器等等
1.实例化期(组件创建)
<1>beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
<2>created:在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el
属性目前不可见。
<3>beforeMount:在挂载开始之前被调用:相关的 render
函数首次被调用。$el
属性已经可见,但还是原来的 DOM,并非是新创建的。
<4>mounted:el
被新创建的 vm.$el
替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted
被调用时 vm.$el
也在文档内。
注意 mounted
不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 替换掉 mounted
:
mounted: function () { this.$nextTick(function () { // Code that will run only after the // entire view has been rendered }) }
2.存在期(组件更新)
<1>beforeUpdate:
数据更新时,虚拟 DOM 变化之前调用,这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
请不要在此函数中更改状态,否则会触发死循环。
<2>updated:
数据更新和虚拟 DOM 变化之后调用。
当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。
和 mounted 一样, updated
不会承诺所有的子组件也都一起被重绘。如果你希望等到整个视图都重绘完毕,可以用 vm.$nextTick 替换掉 updated
:
updated: function () { this.$nextTick(function () { // Code that will run only after the // entire view has been re-rendered }) }
请不要在此函数中更改状态,否则会触发死循环。
3.销毁期(组件销毁)
<1>beforeDestroy:
实例销毁之前调用,在这一步,实例仍然完全可用。一般在这里移除事件监听器、定时器等,避免内存泄漏
<2>destroyed:
Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
所以如果需要用到 Vue 实例指示的所用绑定的东西,需要在 beforeDestroy 中使用。这么说,destroyed 函数能做的事,在 beforeDestroy 也能做,所以没必要在 destroyed 函数中处理。
其他不常用的生命周期函数
-
activated
当组件激活的时候调用,可以参考构建组件 - keep-alive
-
deactivated
当组件停用的时候调用,可以参考构建组件 - keep-alive
-
errorCaptured
这个生命钩子详细请看官网,2.5.0 新增的,当捕获一个来自子孙组件的错误时被调用。