Vue源碼之 diff Vnode

其實如今這個還沒看懂,只能是初步看一下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呢?

相關文章
相關標籤/搜索