vue Virtual DOM建立過程

2021-10-14 08:09:02 字數 2238 閱讀 8211

vue virtual dom建立過程

在 lifecycle.js 中的mountcomponent 中定義了updatecomponent,接收_render()方法作為引數,render接收使用者傳入的render函式

在render.js中定義了_render方法,其中通過call接收render函式,改變內部this,使用了cre

atee

leme

nt函式

,c

與createelement函式, _c與

create

elem

ent函

數,c​

與createelement都是執行createelement函式

在createelement函式內部最終會返回vnode,但是不是在此處定義,函式主要是處理引數,最後呼叫_createelement

在_createelement內部

先判斷 data是否為空,且用_ob_判斷是不是響應式資料,是直接用createemptyvnode返回乙個空節點

判斷data是不是有is屬性,有記錄到tag中 ,is是用來判斷是否是元件

判斷 tag 屬性

判斷作用域插槽

核心:判斷normalizationtype,將陣列拍平,轉為一維陣列

核心:下方判斷是否是字串,建立vnode物件,或是元件的處理元件的vnode,或是處理自定義標籤

vnode的處理過程

在lifecycle.js 中的mountcomponent 中定義了updatecomponent,找到_update方法的定義

利用prevnode判斷是不是首次渲染,呼叫_patch_方法,比較兩個vnode差異,把差異更新到真實dom,返回給el物件

patch是在vue入口內部的注入的,是在 src/platforms/web/runtime/index.js中,會先判斷inbrowser是不是瀏覽器環境

patch是乙個高階函式,柯里化的函式,利用createpatchfunction生成,接收nodeops:一些dom操作,basemodules:處理指令和ref的

patch的實現

patch接收oldvnode,vnode

先判斷新的vnode是否存在,

定義了insertvnodequeue佇列,先插入節點佇列,目的是把對應的dom節點掛載到dom樹上,觸發對應的insert鉤子函式

判斷老的oldvnode是否存在,建立節點,但是不進行掛載

如果新老節點都存在,利用samevnode比較選擇器和key值,然後進行 更新操作,進行diff演算法的patchvnode

invokeinserthook函式就是處理節點對應的鉤子函式

返回vnode.elm,新的dom元素返回,記錄到elm中

createelm的實現,把vnode轉換為真實dom,掛載到dom樹上

先判斷vnode是否有elm屬性,是判斷是不是渲染過

判斷是否元件情況

儲存data,children,tag:標籤名稱 等屬性

判斷是標籤節點情況,是否是開發環境,是不是自定義標籤,報出警告,之後處理dom元素,處理子元素轉換為dom物件,插入到對應的佇列中

判斷是注釋節點時,建立注釋節點,插入到節點佇列中

判斷是文字節點時,呼叫createtextnode建立文字節點,插入到節點佇列中

patchvnode對比新舊節點差異,更新到真實dom,就是diff演算法的過程

核心就是觸發prepatch函式,執行使用者傳入的鉤子函式

觸發所有模組的update函式,執行使用者傳入的update函式

判斷有沒有文字節點,對比updatechildren函式,判斷對應的新老節點的文字內容

updatechildren對比新舊節點,更新dom樹,如果節點未變化,重用該節點

就是snabbdom的updatechildren方法

先定義新老節點開始,結束的索引,

先判斷是否有重複的key,報出警告

開始while遍歷,當老開始節點小於老結束節點,新開始節點小於新結束節點的索引,開始判斷

先判斷老開始節點是否有值,沒有的話獲取下乙個老節點作為索引

判斷老結束節點是否有值,獲取前乙個節點作為結束節點

開始對比陣列中的四個頂點,新開始,新結束,老開始,老結束,是利用patchvnode比較節點和子節點,進行一一對比

如果之前索引都不滿足,會找到新老想同的key作為對比

最後做收尾處理,如果老節點未處理完,插入對應的節點到老節點之後

如果新節點為處理完,移除對應的老節點

Vue Virtual Dom 和 Diff演算法

virtual dom 作用 虛擬dom的最終目標是將虛擬節點渲染到檢視上,但是如果直接使用虛擬節點覆蓋舊節點的話,就會有很多不必要的dom操作.比如,乙個ul下有很多li標籤,其中乙個發生改變,這種情況下如果使用新的ul去替換舊的ul,因為這些不必要的dom操作而造成了效能上的浪費.為了避免不必要...

建立主鍵 建立外來鍵 建立約束

建立主鍵 三種方法 建立學生表 第一種 create table student sno char 5 primary key,學號 可以直接指定主鍵 sname char 20 not null,姓名 s char 3 not null,性別 sage integer not null,年齡 sd...

Oracle建立儲存過程 建立函式 建立包

一 oracle建立儲存過程 1 基本語法 create orreplace procedureupdate emp sal name inout type,name inout type,is begin endupdate emp sal 2 寫乙個簡單的例子修改emp表的ename欄位 cre...