React
本身只是一個DOM
的抽象層崭闲,使?組件構(gòu)建虛擬DOM
首先來看,什么是Virtual DOM
簡單來說,Virtual DOM
本身只是一個js
對象
進(jìn)一步說鼠证,Virtual DOM
是一種編程概念涛目,我們使用js
對象描述真實的DOM
節(jié)點秸谢。當(dāng)這個真實的DOM
節(jié)點需要變化時,我們先去更改js
對象霹肝,然后通過這個js
對象來同步更改DOM
節(jié)點估蹄。這個過程我們稱之為協(xié)調(diào)。協(xié)調(diào)的核心:diff
Fiber
是React16
中新增的協(xié)調(diào)引擎沫换。它的目的是使Virtual DOM
可以進(jìn)行增量式渲染
為什么使用Virtual DOM
簡單來說臭蚁,使用Virtual DOM
性能高
原因是DOM
操作很慢,輕微的操作都可能導(dǎo)致頁面重排讯赏,非常消耗性能垮兑。相對于DOM
對象,js
對象處理起來更快漱挎,而且更簡單系枪。通過diff
算法比對新舊vdom
之間的差異,可以批量的磕谅、最小化的執(zhí)行dom
操作私爷,從而提高性能。
其實真實DOM
也是一個對象怜庸,但是非常大当犯。如下,將div
標(biāo)簽對應(yīng)的真實DOM odiv
的key
值打出來
<body>
<div></div>
</body>
<script>
let odiv = document.getElementsByTagName('div')[0]
let str = ''
for (const key in odiv) {
str += ' ' + key
}
console.log(str)
</script>
可以看見割疾,原生dom
節(jié)點非常龐大嚎卫。如果直接diff
這個對象,那成本太高了
那在React中宏榕,如何使用了Virtual DOM
React
中可以使用JSX
語法描述視圖拓诸,通過babel-loader
轉(zhuǎn)譯后它們變成React.createElement(...)
形式,該函數(shù)將生成vdom
來描述真實dom
麻昼。將來如果發(fā)生狀態(tài)變化奠支,vdom
將作出相應(yīng)變化,再通過diff
算法比對新老vdom
區(qū)別抚芦,從而做出最終dom
操作
以上是關(guān)于React Virtual DOM
的簡單理解