摘要:的一個突出特點(diǎn)是擁有極速地渲染性能。該功能依靠的就是研發(fā)團(tuán)隊弄出的虛擬機(jī)制以及其獨(dú)特的算法。在的算法下,在同一位置對比前后節(jié)點(diǎn)只要發(fā)現(xiàn)不同,就會刪除操作前的節(jié)點(diǎn)包括其子節(jié)點(diǎn),替換為操作后的節(jié)點(diǎn)。
React的一個突出特點(diǎn)是擁有極速地渲染性能。該功能依靠的就是facebook研發(fā)團(tuán)隊弄出的虛擬dom機(jī)制以及其獨(dú)特的diff算法。下面簡單解釋一下react虛擬dom機(jī)制和diff算法的實(shí)現(xiàn)思想:
要講虛擬dom機(jī)制必須提到一個概念——虛擬dom樹,這是react在真實(shí)dom樹基礎(chǔ)上建立的一個抽象的樹,應(yīng)用、虛擬dom與真實(shí)dom的關(guān)系如下圖顯示:
而標(biāo)準(zhǔn)的dom機(jī)制如下圖所示:
對比兩個圖就可以發(fā)現(xiàn)標(biāo)準(zhǔn)dom機(jī)制下,用戶在應(yīng)用上的操作是直接對真實(shí)dom進(jìn)行操作的,而在react應(yīng)用中,用戶在應(yīng)用中對dom的操作其實(shí)是對虛擬dom的操作,用戶的操作產(chǎn)生的數(shù)據(jù)改變或者state變量改變(此處的改變具體的講就是事件函數(shù)對dom的操作)都會保存到虛擬dom上,之后再批量的對這些更改進(jìn)行diff算法計算,對比操作前后的虛擬dom樹,把更改后的變化再同步到真實(shí)dom上。舉個例子:
標(biāo)準(zhǔn)dom機(jī)制下對某一節(jié)點(diǎn)在事件函數(shù)中做如下操作:
var A=document.getElementById("test"); A.style.backgroundColor = "black"; A.style.backgroundColor = "red"; A.style.backgroundColor = "black";
如上所示,在標(biāo)準(zhǔn)dom機(jī)制下,會對A節(jié)點(diǎn)進(jìn)行三次的dom操作。
而在react應(yīng)用的事件函數(shù)中進(jìn)行如上操作時,同樣會在虛擬dom上進(jìn)行三次dom的操作,但在真實(shí)dom中,它只會執(zhí)行一次dom操作,即A.style.backgroundColor = "black";因?yàn)樵趓eact虛擬dom機(jī)制中,它會把所有的操作都會合并,只會對比剛開始的狀態(tài)和最后操作的狀態(tài),兩者中找出不同再同步到真實(shí)dom中,這就大大減少了真實(shí)dom的操作,而眾所周知,dom操作是很耗性能的,這是react能做到極速渲染的原因之一。
另外一個原因就是react獨(dú)特的diff算法,同樣給出標(biāo)準(zhǔn)diff算法和react diff算法的描述,對比了就會明白了:
首先講一下diff算法的處理方法,對操作前后的dom樹同一層的節(jié)點(diǎn)進(jìn)行對比,一層一層對比,如下圖:
在標(biāo)準(zhǔn)dom機(jī)制下:在同一位置對比前后的dom節(jié)點(diǎn),發(fā)現(xiàn)節(jié)點(diǎn)改變了,會繼續(xù)比較該節(jié)點(diǎn)的子節(jié)點(diǎn),一層層對比,找到不同的節(jié)點(diǎn),然后更新節(jié)點(diǎn)。
在react的diff算法下,在同一位置對比前后dom節(jié)點(diǎn),只要發(fā)現(xiàn)不同,就會刪除操作前的domm節(jié)點(diǎn)(包括其子節(jié)點(diǎn)),替換為操作后的dom節(jié)點(diǎn)。
對比兩種diff算法,大家可以發(fā)現(xiàn),react的diff算法下,當(dāng)dom節(jié)點(diǎn)更改時,會大大減少dom樹的節(jié)點(diǎn)遍歷,這也是其另外一個可以實(shí)現(xiàn)極速渲染的一個原因。
歡迎朋友們交流!嗷嗚~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87236.html
摘要:市面上竟然擁有多個虛擬庫。虛擬庫,就是出來后的一種新式庫,以虛擬與算法為核心,屏蔽操作,操作數(shù)據(jù)即操作視圖。及其他虛擬庫已經(jīng)將虛擬的生成交由與處理了,因此不同點(diǎn)是,虛擬的結(jié)構(gòu)與算法。因此虛擬庫是分為兩大派系算法派與擬態(tài)派。 去哪兒網(wǎng)迷你React是年初立項(xiàng)的新作品,在這前,去哪兒網(wǎng)已經(jīng)深耕多年,擁有QRN(react-native的公司制定版),HY(基于React的hybird方案)...
摘要:因?yàn)榘姹緦⒄嬲龔U棄這三生命周期到目前為止,的渲染機(jī)制遵循同步渲染首次渲染,更新時更新時卸載時期間每個周期函數(shù)各司其職,輸入輸出都是可預(yù)測,一路下來很順暢。通過進(jìn)一步觀察可以發(fā)現(xiàn),預(yù)廢棄的三個生命周期函數(shù)都發(fā)生在虛擬的構(gòu)建期間,也就是之前。 showImg(https://segmentfault.com/img/bVbweoj?w=559&h=300); 背景 前段時間準(zhǔn)備前端招聘事項(xiàng)...
摘要:是一個最小的庫,但由于其對尺寸的追求,它的很多代碼可讀性比較差,市面上也很少有全面且詳細(xì)介紹的文章,本篇文章希望能幫助你學(xué)習(xí)的源碼。建議與源碼一起閱讀本文。 作為一名前端,我們需要深入學(xué)習(xí)react的運(yùn)行機(jī)制,但是react源碼量已經(jīng)相當(dāng)龐大,從學(xué)習(xí)的角度,性價比不高,所以學(xué)習(xí)一個react mini庫是一個深入學(xué)習(xí)react的一個不錯的方法。 preact是一個最小的react mi...
摘要:并且處理特殊屬性,比如事件綁定。之后根據(jù)差異對象操作元素位置變動,刪除,添加等。當(dāng)節(jié)點(diǎn)數(shù)過大或者頁面更新次數(shù)過多時,頁面卡頓的現(xiàn)象會比較明顯。基于注意使用來減少組件不必要的更新。 1、什么是Diff算法 傳統(tǒng)Diff:diff算法即差異查找算法;對于Html DOM結(jié)構(gòu)即為tree的差異查找算法;而對于計算兩顆樹的差異時間復(fù)雜度為O(n^3),顯然成本太高,React不可能采用這種...
摘要:并且處理特殊屬性,比如事件綁定。之后根據(jù)差異對象操作元素位置變動,刪除,添加等。當(dāng)節(jié)點(diǎn)數(shù)過大或者頁面更新次數(shù)過多時,頁面卡頓的現(xiàn)象會比較明顯。基于注意使用來減少組件不必要的更新。 1、什么是Diff算法 傳統(tǒng)Diff:diff算法即差異查找算法;對于Html DOM結(jié)構(gòu)即為tree的差異查找算法;而對于計算兩顆樹的差異時間復(fù)雜度為O(n^3),顯然成本太高,React不可能采用這種...
閱讀 2879·2021-11-16 11:55
閱讀 2629·2021-09-29 09:34
閱讀 3448·2021-09-01 14:21
閱讀 3783·2019-08-29 12:36
閱讀 708·2019-08-26 10:55
閱讀 4002·2019-08-26 10:20
閱讀 1039·2019-08-23 18:19
閱讀 1206·2019-08-23 17:56