请阐述vue生命周期

📌 new Vue以后,发生了什么?数据改变后,又发生了什么?

image.png

  • 建立vue实例和建立组件的流程基本同样
  1. 首先作一些初始化的操做,主要是设置一些私有属性到实例中,例如:_开头的的属性以及$开头的属性
  2. 运行声明周期钩子函数beforCreate
  3. 进入注入流程:处理属性、computed、methods、data、provide、inject,最后使用代理模式将它们挂载到实例中
  4. 运行生命周期钩子函数created
  5. 生成render函数:若是有配置,直接使用配置的render,若是没有,使用运行时编译器,把模板编译为render
  1. 运行生命周期钩子函数beforMount
  2. 生成真实dom,关于如何生成真实dom,详细过程能够瞅瞅个人上一篇文章:请阐述vue的diff算法,它会建立一个Watcher进行观察,传入一个函数updateComponent,该函数会运行_render,获得当前组件虚拟dom的根节点(vnode),而后把获得vnode再传入_updata函数执行。html

    在执行_render函数的过程当中,会收集全部依赖,未来依赖变化时会从新运行updataComonent函数vue

    在执行_update函数的过程当中,触发patch函数,若是当前没有旧树,说明这是第一次渲染,它会直接为当前的虚拟dom树的每个普通节点生成elm属性,也就是真实dom。若是存在旧树,说明以前已经渲染过了,而后会触发patch函数,进行新旧两棵树对比更新处理,随后让新树的节点对应合适的真实dom,这里就先假设它是第一次渲染。node

    若是遇到建立一个组件的vnode,那么它会进入组件实例化流程,这个流程和建立vue实例流程基本相同,也就是至关于递归循环以上步骤,最终会把建立好的组件实例挂载vnode的componentInstance属性中,方便复用。算法

    这一步完成后,页面上已经能够看到东西了。dom

  3. 运行生命周期钩子函数mounted
  • 重渲染
  1. 数据变化后,全部依赖该数据的Watcher都会从新运行,这里只考虑updateComponent函数对应的Watcher
  2. Watcher会被调度器放到nextTick中运行,也就是微队列中,这样是为了不多个依赖的数据同时改变后被屡次执行。
  3. 运行生命周期钩子函数beforeUpdate
  4. updateComponent函数从新执行ide

    在执行_render函数的过程当中,会去掉以前的依赖,毕竟也要考虑v-if的感觉,从新收集全部依赖,未来依赖变化时会从新运行updateCompontent函数函数

    在执行_updata函数的过程当中,触发patch函数,而后新旧两棵树进行对比:post

    • 普通html节点的对比会致使真实节点被建立、删除、移动、更新
    • 组件节点的对比一样会致使组件被建立、删除、移动、更新

    当新组件须要被建立时,进入实例化流程,从第一条再走一遍流程就能够了spa

    当旧组件须要被删除时,会调用组件的$destroy方法,而后触发生命周期钩子函数destroyed代理

    当组件属性更新时,至关于组件的updataComponent函数被从新触发执行,进入重渲染流程,走一遍重渲染流程就好了

  5. 运行生命周期钩子函数updated

😊 好了, 以上就是个人分享,你们对于vue生命周期还有其它理解的话能够在评论区讨论鸭~

但愿小伙伴们点赞 👍 支持一下哦~ 😘,我会更有动力的 🤞

相关文章
相关标签/搜索