vue的生命周期及与其子组件生命周期执行顺序

1、vue的生命周期图

vue的生命周期及与其子组件生命周期执行顺序

生命周期钩子

vue生命周期总共分为8个阶段: 创建前/后,载入前/后,更新前/后, 销毁前/后。

创建前/后:

beforeCreate(创建前):vue实例的挂载元素$el和数据对象 data都是undefined, 还未初始化
created (创建后) :实例创建完成后,完成了 data数据初始化, 但是el还未初始化。
载入前/后
beforeMount (载入前): vue实例的$el和data都初始化了, 相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。
mounted (载入后) :在el 被新创建的 vm.$el替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。

更新前/后

beforeUpdate (更新前): 在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程
updated (更新后) :在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。

销毁前/后

beforeDestroy (销毁前) :在实例销毁之前调用。实例仍然完全可用。
destroyed (销毁后) :在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。

当组件被keep-alive包裹时(缓存)时,会多出activated和deactivated的两个生命周钩子函数。

activated 组件**时调用。
deactivated 组件停用时调用。

2.子组件的beforeCreate、Created、beforeMount、Mounted阶段

在父组件执行beforeMount阶段后,进入子组件的beforeCreate、Created、beforeMount阶段,这些阶段和父组件类似,按下不表。beforeMount阶段后,执行的是Mounted阶段,该阶段时子组件已经挂载到父组件上,并且父组件随之挂载到页面中。

由下图可以知道,在beforeMount阶段之后、Mounted阶段之前,数据已经被加载到视图上了,即$el元素被挂载到页面时触发了视图的更新

vue的生命周期及与其子组件生命周期执行顺序

3.组件的activated阶段

我们发现在组件全部挂载到页面之后被触发。这是因为组件被 包裹,随$el的挂载被触发。如果组件没有被包裹,那么该阶段将不会被触发。
vue的生命周期及与其子组件生命周期执行顺序

4.beforeDestroy和destroyed钩子函数间的生命周期

现在我们对Vue实例进行销毁,调用app.$destroy()方法即可将其销毁,控制台测试如下:
vue的生命周期及与其子组件生命周期执行顺序
我们发现实例依然存在,但是此时变化已经发生在了其他地方。

beforeDestroy钩子函数在实例销毁之前调用。在这一步,实例仍然完全可用。

destroyed钩子函数在Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁(也就是说子组件也会触发相应的函数)。这里的销毁并不指代’抹去’,而是表示’解绑’。

销毁时beforeDestory函数的传递顺序为由父到子,destory的传递顺序为由子到父。

5.总结

1.加载渲染过程

父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted

2.子组件更新过程

父beforeUpdate->子beforeUpdate->子updated->父updated

3.销毁过程

父beforeDestroy->子beforeDestroy->子destroyed->父destroyed