Vue生命周期结合官网及其他人的博客个人理解

299 阅读2分钟
  1. New Vue()

  2. beforecreate

    • 在实例初始化之后,数据观测(data observer)和event/watcher事件配置之前调用
    • 没有数据没有DOM
  3. 初始化实例事件和生命周期

  4. created

    • 实例创建完后立即调用,完成数据观测,属性和方法的运算,watch/event事件回调,挂载阶段未开始。$el属性不可用
    • 有数据没有DOM
  5. 判断是有el选项,如果没有调用vm.$mount(el)这个方法。如果有el那么判断是否有template选项,如果有的话,把template编译成render function。没有的话将el外部的html作为template编译。

    • 将data中的数据和Vue中的模板编译成html文档,此时有了虚拟DOM
    • render (h) {return h('div', {}, this.text)}
    • (render函数:传参h就是Vue里面的createElement方法,return返回一个createElement方法,其中要传三个参数,第一个参数就是要创建的div标签,第二个参数穿了一个对象,对象里面可以是我们组件上面的props,或者是事件之类的东西;第三个参数就是div标签里面的内容,这里指向了data里面的text)
  6. beforemounte

    • 在挂载开始之前被调用,相关的 render 函数首次被调用
    • 有数据有虚拟DOM
  7. 将编译好的html替换vue上的el属性所指向的DOM对象或替换对面的html标签里的内容。完成挂载,形成真实DOM

  8. mounted

    • 实例被挂载后调用,这时 el 被新创建的 vm.$el 替换了
    • 如果根实例挂载到了一个文档内的元素上,当mounted被调用时vm.$el也在文档内。
    • 注意 mounted 不会保证所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以在 mounted 内部使用 vm.$nextTick:
    • 有数据和真实DOM
    • 以上钩子函数在整个Vue生命周期内只执行一次
  9. beforeUpdate

    • 数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器
  10. updated

    • 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
    • 当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。
    • 注意 updated 不会保证所有的子组件也都一起被重绘。如果你希望等到整个视图都重绘完毕,可以在 updated 里使用 vm.$nextTick:
  11. beforeDestroy

    • 实例销毁之前调用。在这一步,实例仍然完全可用。
    • 可以做一些路由离开的时候操作,因为这个周期里面还可以使用data和method。比如一个倒计时组件,如果在路由跳转的时候没有清除,这个定时器还是在的,这时候就可以在这个里面清除计时器。
  12. destroyed

    • 实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。