Vue 组件的生命周期


作者:Seiya

时间:2019年08月23日


生命周期图






创建阶段




beforeCreate

  • 实例初始化 —— new Vue()

  • 数据观测 —— 在vue的响应式系统中加入data对象中所有数据;

  • 暴露属性和方法 —— 就是 vue 实例自带的一些属性和方法;



created

  • 初始化实例中的各种属性,包括:Inject 、Provide 、 props 、methods 、data 、computed 和 watch 等;

  • 当 created 阶段完成之后,vue 会优先判断实例中是否含有 "el" 属性,如果没有,则调用 vm.$mount(el) 方法,然后执行下一步;如果有的话,直接执行下一步;

  • 然后判断是否含有 “template” 属性,如果有的话,把 template 解析成一个 render 函数;如果没有,就调用外部的 html(注意:实例内部的 template 属性比外部的优先级高);若都不存在,那么 vue 会抛出错误;

  • 如果 vue 实例中存在 render 函数,那么优先级为:render函数 > template属性 > 外部html



beforeMount

执行 render 函数进行模板编译,生成 Virtual DOM。


注意:

beforeMount 在有了 render 函数的时候才会执行,当执行完 render 函数之后,就会调用 mounted 这个钩子。



mounted

将生成后的 Virtual DOM 渲染到 DOM 中。


注意:

在 mounted 挂载完毕之后,这个实例就算是走完流程了。因为后续的钩子函数执行的过程都是需要外部的触发才会执行。





更新阶段




beforeUpdate

每当数据变化或者强制更新( this.$forceUpdate() )的时候,就会开始执行 render 函数,生成最新的 Virtual DOM,开始更新真实 DOM。



updated

当 DOM 更新完毕时,开始执行 updated 钩子函数。因为有多个组件的时候,会有很多个 watcher ,在这里,就是检查当前的得 watcher 是哪个,是当前的话,就直接执行当前 updated 钩子。

这里和 mounted 一样,它承诺子组件已经更新完。此时,如果你想操作 DOM 的话,需要放到 this.$nextTick 的回调中。


注意:

在 beforeUpdate 和 updated 钩子函数中,切记不可更改依赖数据,否则会导致死循环。





销毁阶段




beforeDestroy

当组件开始销毁的时候,它会调用 beforeDestory。在卸载前,检查是否已经被卸载,如果已经被卸载,就直接 return 出去。



destroyed

destroyed 阶段就是把所有有关自己痕迹的地方,都给删除掉,比如:从父级删除自己、拆解观察者等。





总结


  1. beforeCreate :初始化了部分参数,如果有相同的参数,做了参数合并,执行 beforeCreate ;

  2. created :初始化了 Inject 、Provide 、 props 、methods 、data 、computed 和 watch,执行 created ;

  3. beforeMount :检查是否存在 el 属性,存在的话进行渲染 dom 操作,执行 beforeMount ;

  4. mounted :实例化 Watcher ,渲染 dom,执行 mounted ;

  5. beforeUpdate :在数据更新的时候,执行 beforeUpdate ;

  6. updated :检查当前的 watcher 列表中,是否存在当前要更新数据的 watcher ,如果存在就执行 updated ;

  7. beforeDestroy :检查是否已经被卸载,如果已经被卸载,就直接 return 出去,否则执行 beforeDestroy ;

  8. destroyed :把所有有关自己痕迹的地方,都给删除掉;

最后更新时间: 2019-8-24 10:56:23