Vue虛擬DOM是這樣實現的

2021-10-08 16:05:37 字數 1764 閱讀 1645

虛擬dom就是通過乙個js物件來描述乙個dom節點,比如

="a" id=

"b">我是內容<

/div>

,text:

'我是內容'

,// 文字內容

children:

// 子元素}

通過下面物件描述的方式,將上面的div標籤描述出來

我們都知道vue採用的是mvvm的框,核心思想就是通過資料控制檢視,當時資料發生後變化的時候檢視也要發生對應的變化,如果不採用虛擬dom技術,每一次都去操作真實的dom樹那麼在效能方面的消耗將會是非常大的。採用虛擬dom的方式通過js模擬出的dom節點,在每次資料法還是能變化的時候我們只需要通過diff演算法來對比計算出需要更新的節點,這樣會大大提公升檢視層渲染效能。

vue中的虛擬dom主要通過vnode類實現,以下是vnode類的原始碼

export

default

class

vnode

getchild()

: component |

void

}

vnode的型別

vnode類中只有三種型別的節點可以被建立和插入到dom中分別是元素節點,文字節點,注釋節點。

描述乙個注釋節點,只需要傳入兩個屬性,即:text和iscomment,text代表的是傳入的具體注釋資訊,iscomment代表的則是該節點是不是注釋節點,返回乙個布林值

// 建立注釋節點

export

const createemptyvnode =

(text: string ='')

=>

只需要乙個屬性,那就是text屬性,用來表示具體的文字資訊。

// 建立文字節點

export

function

createtextvnode

(val: string | number)

元素節點是比較接近我們日常所接觸的dom樹,元素節點的作用就是要將這樣的html5標籤拆分成為包含tag,data,attribute,children等屬性的乙個js物件,方便進行dom更新。

// 真實dom節點

'a'>

元素節點<

/span>

<

/div>

// vnode節點

,children:

}

元件其實就是乙個可以服用的ui**片段,那麼本質上就是有多個html標籤組成的,這樣元件本質上和元素節點是相同的,但是元件和元素節點還是有區別的,元件會有自身的一些屬性,比如props,以及該元件對應的vue例項。

componentoptions :元件的option選項,如元件的props等

componentinstance :當前元件節點對應的vue例項

fncontext:函式式元件對應的vue例項

fnoptions: 元件的option選項

其實vnode的作用是相當大的。我們在檢視渲染之前,把寫好的template模板先編譯成vnode並快取下來,等到資料發生變化頁面需要重新渲染的時候,我們把資料發生變化後生成的vnode與前一次快取下來的vnode進行對比,找出差異,然後有差異的vnode對應的真實dom節點就是需要重新渲染的節點,最後根據有差異的vnode建立出真實的dom節點再插入到檢視中,最終完成一次檢視更新。

面試 vue 什麼是虛擬dom?

官方概念 vue通過建立乙個虛擬的dom數對真實的dom發生的變化保持追蹤 一棵真實的dom樹的渲染需要先解析css樣式和dom樹,然後將其整合成一棵渲染樹,再通過布局演算法去計算每個節點在瀏覽器中的位置,最終輸出到顯示器上面。而我們所提及的虛擬的dom 則可以理解為儲存了一棵dom樹被渲染之前所包...

vue虛擬DOM是什麼?vue的虛擬DOM的用法

vue虛擬dom是什麼?vue的虛擬dom的用法 1 為什麼需要虛擬dom 雖然採用的是文件碎片,但是操作的還是真實的dom。而我們知道操作dom的代價是昂貴的,所以vue2.0採用了虛擬dom來代替對真實dom的操作,最後通過某種機制來完成對真實dom的更新,渲染檢視。所謂的虛擬dom,其實就是用...

Vue中的虛擬DOM

眾所周知,在網頁中最大的開銷就是dom操作,dom很慢而且非常龐大。原生 js 或 jq 操作dom時,瀏覽器會從構建dom樹開始從頭到尾執行一遍流程。在一次操作中,我需要更新10個節點,瀏覽器不知道共有10個節點要更新,就會執行10次更新操作,浪費效能,使頁面出現卡頓,影響使用者體驗。於是,就出現...