vue实例的创建过程与组件的创建过程基本相同
首先,在实例中设置一些专用属性,例如以_开头的属性和以$开头的属性
运行声明周期钩子函数beforCreate
进入注入过程。 处理属性、computed、methods、data、provide和inject,最后使用代理模式装载到实例上
运行生命周期钩子函数created
生成render函数:如果有配置,请接受配置的render。 如果没有,请使用运行时编译器将模板编译为render
运行生命周期钩子函数beforMount
关于如何生成实际的dom,生成实际的dom,详细的过程可以看到我前面的文章。 请描述vue的diff算法。 它创建并观察Watcher,传递函数updateComponent,然后该函数执行_render以获得当前组件的虚拟dom的根节点(vnode )。
_render函数运行时收集所有依存关系,并在将来依存关系发生变化时重新执行updataComonent函数
_update函数运行时,将触发patch函数。 如果当前没有旧树,则这是第一次渲染,直接为当前虚拟dom树的所有常规节点生成elm属性(实际dom )。 如果有旧树,则表示以前渲染过,然后启动patch函数进行新旧两棵树的比较更新处理,然后将新树的节点与相应的实dom对应。 在这里,假设那是第一次渲染。
遇到创建组件的vnode时,将进入组件实例化过程。 此过程与创建vue实例的过程基本相同。 这意味着可以递归循环执行上述步骤,最终将创建的组件实例装载到vnode的componentInstance属性中,以便于重用。
完成这个步骤后,你会在页面上看到一些东西。
运行生命周期钩子函数mounted
重新渲染数据时,依赖于该数据的所有Watcher都会重新运行。 这里只考虑与更新组件函数对应的Watcher
调度程序将Watcher放入nextTick (即微队列)中运行。 这是为了防止多个从属数据同时更改并多次运行。
运行生命周期钩子函数beforeUpdate
重新运行更新组件函数
在运行_render函数的过程中,之前的依赖关系将被移除。 仅考虑v-if的感受,重新收集所有依存关系,并在将来依存关系发生变化时重新运行updateCompontent函数
_updata函数运行时,触发patch函数并比较新旧两棵树。
常规html节点的对比导致组件节点的对比(其中实际节点被创建、删除、移动和更新)导致组件的创建、删除、移动和更新,以及如果需要创建新组件,则在实例化过程中
如果需要删除旧组件,则会调用组件的$destroy方法以触发生命周期挂接函数destroyed
当组件的属性被更新时,对应于组件的updataComponent函数可以重新启动并执行,进入重新渲染过程,然后再次执行重新渲染过程
运行生命周期钩子函数updated
作者:法医学
链接: https://juejin.cn/post/695969978463466318
资料来源:掘金