其实如今这个还没看懂,只能是初步看一下node
_update调用__patch__方法,若是prevVnode(也就是oldVnode),旧vnode和新vnode对比,若是没有,就vnode就是vm.$el,就是挂载的那个真实node数组
这样进入patch方法以后,先判断oldVnode是否认义了,若是没有,说明这是VueComponent在_init方法中调用到了本方法,这里下面再说。spa
若是oldVnode定义了,且是真实节点,说明是new Vue 的那个vm在_init方法中调用到了本方法,那么调用createElm方法,建立新节点,递归建立子节点,并用新节点替换掉以前挂载的节点递归
若是oldVnode定义了,且是虚拟节点,说明是vm(根Vue或者组件)在_update方法中调用了本方法,那么patchVnode,对比(这里还要细看)。it
建立新节点:createElm方法,首先判断是否是组件节点,若是不是,好比第一次要挂载的根Vue节点,或者真实节点,先建立node(setScope这里是给stypeScoped生成data-XXXXX?),invokeCreateHooks把属性设置进去class
而后建立(递归)子节点,date
-----------------------------------方法
几个疑问:co
一、patch中的createElm方法是建立真实节点,若是不是组件节点,在createChildren递归建立子节点以后,if (isDef(data)) {invokeCreateHooks(vnode, insertedVnodeQueue);}这句话的意思?
background
点进去,cbs是一个数组,大概8个元素,里面的方法主要是来create或者update attr,class,on,style这些节点属性的,若是新节点有而旧节点没有那么就添加,若是新节点没有而旧节点有就删除掉。
再往下,是data.hook的,可是这个hook是在_c方法中一路下来在createComponent方法中,installComponentHooks方法中添加到vnode.data中的,也就是说只有建立组件节点的Vnode的时候data里面才有hook属性。然而当前是
建立真实节点的逻辑,为何会判断hook呢?