Vue生命周期钩子函数

219 阅读4分钟

一切的开始都要源于Vue官网的这张图,无法忽视:

lifecycle.png

下面主要从四个方面总结性地记录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去测试打印结果。

此外,还有很多可拓展和纵向思考的东西,待后续深入整理。