一切的开始都要源于Vue官网的这张图,无法忽视:
下面主要从四个方面总结性地记录Vue的生命周期钩子函数。有不合适的地方,欢迎指正。
一、组件的生命周期钩子函数
1、创建期间的生命周期函数(四个)
new Vue() 表示创建一个Vue实例对象。
init Events & Lifecycle :表示刚初始化了一个空的实例对象。这个对象上,只有一些默认的事件和生命周期,其他的都未被创建。
beforeCreate:这是遇到的第一个生命周期函数。 表示实例被完全创建出来之前。执行在数据观测和事件配置之前。
注意:它执行时,data和methods、computed、watch都还没有初始化,均不能访问。(比如,通过this调用data和methods时,提醒undefined和function没有定义。)
created: 这是遇到的第二个生命周期函数。实例创建完成,可访问data,computed,watch和methods上的数据和方法,但是未挂载DOM,不能访问el。
注意:如果要调用methods中的方法或者操作data中的数据,最早,只能在created中操作。
init injections & reactivity 通过依赖注入依赖项 然后Vue开始编译模板,把Vue代码中的指令进行执行,最终在内存中生成一个编译好的最终模板字符串,然后把这个模板字符串渲染为内存中的DOM。此时,只是在内存中渲染好了模板,并没有把模板挂载到真正的页面中去。
beforeMount: 这是遇到的第三个生命周期函数。(模板编译,挂载之前) 此函数执行的时候,模板已经在内存中编译好了,但是尚未把模板挂载到页面中。此时 页面是旧的。 在beforeMount执行的时候,页面中的元素还没有被真正的替换过来,只是之前写的一些模板字符串。
=== 等挂载到页面上之后,执行下一个。
Mounted: 这是遇到的第四个生命周期函数。 表示内存中的模板已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了。
注意:mounted是实例创建期间的最后一个生命周期函数,当执行完mounted就表示实例已经被完全创建好了,如果没有其他操作的话,这个实例就静静存在于内存中。
注意 mounted 不会保证所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以在 mounted 内部使用 vm.$nextTick:
如果要操作页面上节点,最早,要在mounted中进行。 只要执行完mounted,就表示整个Vue实例已经初始化完毕了。 此时,已经脱离了创建阶段。进入到运行阶段。
2、运行期间的生命周期函数
下面这两个会根据数据的改变,有选择性的触发0次或多次。
beforeUpdate:数据肯定被更新了。 结论:当执行时,页面中显示的数据还是旧的,此时data中的数据是最新的,页面尚未和最新的数据保持同步。
然后重新计算,内存中重新计算一份虚拟DOM树,然后渲染到页面中。
updated:执行时,页面和data已经保持同步了,都是最新的。
3、销毁期间的生命周期函数:
beforeDestroy:执行时,实例就已经从运行阶段进入到销毁阶段。 执行时,实例身上所有的data和methods,以及过滤器、指令等,都处于可用状态,此时,还没有执行真正的销毁过程。
destroyed:组件已经被完全销毁了,此时,所有的数据,方法,过滤器等都不可用。
二、keep-alive 生命周期函数
activated : 被 keep-alive 缓存的组件激活时调用。
在使用vue-router时有时需要使用来缓存组件状态,这个时候created钩子就不会被重复调用了, 如果我们的子组件需要在每次加载的时候进行某些操作,可以使用activated钩子触发。
deactivated:被 keep-alive 缓存的组件停用时调用。
三、errorCaptured
2.5.0+ 新增。用来捕获子组件的错误。它是Vue中处理错误的一种方法,抽时间可单独研究一下。
四、父子组件生命周期执行顺序(面试题)
加载渲染过程:
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
子组件更新过程
父beforeUpdate->子beforeUpdate->子updated->父updated
父组件更新过程
父beforeUpdate->父updated
销毁过程
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
以上自己都可以写简单的demo去测试打印结果。
此外,还有很多可拓展和纵向思考的东西,待后续深入整理。