虛擬dom 虛擬 DOM 和 DOM diff

2021-10-12 21:48:53 字數 2481 閱讀 4152

乙個能代表dom樹的物件,通常含有標籤名標籤上的屬性事件監聽和子元素及其它屬性。

虛擬dom在vue和react中的示例:

const rnode = , 

],classname: "red" // 標籤上的屬性

onclick: () => {} // 事件

},ref: null,

type: "div", // 標籤名 or 元件名

...}const vnode = // 事件}},

children: [ // 子元素們,],

...}

createelement('div',},[

createelement('span', {}, 'span1'),

createelement('span', {}, 'span2')

])//vue(只能在 render 函式裡得到 h)

h('div',

},}, [h('span',{},'span1'), h('span', {}, 'span2'])

//react jsx

{}}">

span1

span2

//vue template

h('div',

},}, [h('span',{},'span1'), h('span', {}, 'span2'])

//react

span1

span2

//通過 babel 轉為 createelement 形式

//vue template

span1

span2

//通過 vue-loader 轉為 h 形式

dom操作慢?虛擬dom快?

我們來仔細分析下這句話的適用場景,這句話就好比「劉翔矮(對比於姚明來說)」,同樣dom操作慢是對比於js原生api,如陣列操作。任何基於dom的庫(vue/react)都不可能在操作dom時比dom快。

為什麼大家這麼說呢?因為在某些情況下,虛擬dom快。
假如一次操作中有10次更新dom的動作,虛擬dom不會立即操作dom,而是將這10次更新的diff內容儲存到本地的乙個js物件中,最終將這個js物件一次性attach到dom樹上,通知瀏覽器去執行繪製工作,這樣可以避免大量的無謂的計算量。

虛擬 dom 的優點 :

跨平台虛擬 dom 的缺點

dom diff其實就是乙個函式,你可以稱它為patch

patches = patch(oldvnode, newvnode)

你可以把虛擬dom想象成一棵大樹的形狀,畫面自己腦補把!

假設有如下的**:

結合下面的樹形結構:

當資料變化時

x 從 red變成green

dom diff發現:div標籤型別沒變,只需要更新 div 對應的 dom 的屬性;子元素沒變,不更新。

y 從 true變成false

dom diff發現:div 沒變,不用更新;子元素1標籤沒變,但是children變了,更新 dom 內容;子元素2不見了,刪除對應的 dom。

通過上面的分析研究,猜測出dom diff 的大概邏輯是:

將新舊兩棵樹逐層對比,找出哪些節點需要更新;如果節點是元件就看 component diff;如果節點是標籤就看 element diff。

如果節點是元件,就先看元件型別;型別不同直接替換(刪除舊的);型別相同則只更新屬性;然後深入元件做 tree diff(遞迴)。

如果節點是原生標籤,則看標籤名;標籤名不同直接替換,相同則只更新屬性;然後進入標籤後代做 tree diff(遞迴)。

但是dom diff 存在乙個問題(key),在同級節點對比存在bug

如果你現在有3個相同型別的同級標籤,當刪除第2個的時候,我們的預期是當前操作後只剩下1和3,但是計算機不會和我們一樣去解決問題,它會理解為你把第2個改為了第3個,然後再把第3個刪除。怎麼解決呢?

在每乙個相同型別的同級標籤上新增乙個唯一的key,這樣dom diff就會明確地知道你操作的是哪個元素。

虛擬DOM與真實DOM

先來個簡單的react例子 1.建立虛擬dom const vdom hello react h1 此處不要寫引號,因為不是字串 2.渲染虛擬dom到頁面 reactdom.render vdom document.getelementbyid test script head test div b...

虛擬DOM操作

什麼是虛擬dom 虛擬dom的設計思想 1 提供一種方便的工具,使得開發效率得到保障 2 保證最小化的dom操作,使得執行效率得到保障 也就是說,虛擬dom的框架 工具都是這麼做的 根據虛擬dom樹最初渲染成真實dom 當資料變化,或者說是頁面需要重新渲染的時候,會重新生成乙個新的完整的虛擬dom ...

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

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