摘要:二原理每個都有兩個,一個是新的,一個是原來的。三實(shí)現(xiàn)過程四算法的理解與實(shí)現(xiàn)本質(zhì)上就是在和之間做了一個緩存。將差異的應(yīng)用到真正的樹上對真實(shí)上的樹進(jìn)行深度優(yōu)先遍歷,在所有的差異列表中找出當(dāng)前遍歷的節(jié)點(diǎn)差異,然后根據(jù)不同進(jìn)行操作。
React Virtual DOM 一、概念
在react中,對于每個DOM對象都有一個相應(yīng)的“虛擬DOM對象”,相當(dāng)于DOM對象的輕量級副本
由于是Virtual DOM只是一個副本,具有與真實(shí)的DOM對象相同的屬性,但是無法直接更改瀏覽器屏幕上內(nèi)容的真實(shí)功能
當(dāng)直接操作DOM時涉及到直接更改頁面,所有操作DOM會比較慢,正因?yàn)椴僮鱒irtual DOM不會直接改變真實(shí)的DOM,所以操作Virtual DOM速度會更快。
二、原理每個Virtual DOM都有兩個DOM Tree,一個是新的,一個是原來的。當(dāng)Virtual DOM更新后,React會將Virtual DOM與更新前獲取的Virtual DOM進(jìn)行比較(這個過程叫做“差異化”,是整個實(shí)現(xiàn)Virtual DOM更新的核心),但獲取到了變化的Virtual DOM對象之后,React就可以直接在真實(shí)的DOM更新這些對象,并且只更新更改的對象。
三、實(shí)現(xiàn)過程 四、算法的理解與實(shí)現(xiàn)Virtual DOM本質(zhì)上就是在JS和DOM之間做了一個緩存。JS只操作Virtual DOM,最后的時候把變更的內(nèi)容寫入到DOM
Virtual DOM算法包括幾個步驟:
1、用JavaScript對象結(jié)構(gòu)表示DOM樹的結(jié)構(gòu)
記錄節(jié)點(diǎn)的類型、屬性和子節(jié)點(diǎn),將其轉(zhuǎn)化成具有相同屬性(tagName=""、props={}、children=[]和key=""),并且對每個節(jié)點(diǎn)進(jìn)行標(biāo)記
對于Element創(chuàng)建一個原型鏈render()方法,用于渲染oldTree
2、比較兩棵Virtual DOM的差異
記錄差異類型
通過采用深度優(yōu)先遍歷來標(biāo)識每一個節(jié)點(diǎn),深度優(yōu)先遍歷本質(zhì)是通過循環(huán)遞歸創(chuàng)建棧
當(dāng)替換當(dāng)前節(jié)點(diǎn)或子節(jié)點(diǎn)或文本,新增、刪除子節(jié)點(diǎn)或文本以及對節(jié)點(diǎn)重新排序等,可以通過定義幾種差異類型來對virtual DOM的差異進(jìn)行判斷
列表對比算法,當(dāng)知道了新舊tree的順序,這主要是要去解決字符串的最小編輯距離問題,一般采用動態(tài)規(guī)劃來求解。
3、將差異的應(yīng)用到真正的DOM樹上
對真實(shí)DOM上的樹進(jìn)行深度優(yōu)先遍歷,在所有的差異列表中找出當(dāng)前遍歷的節(jié)點(diǎn)差異,然后根據(jù)不同進(jìn)行操作。比如說,如果其差異類型是替換節(jié)點(diǎn),可通過DOM節(jié)點(diǎn)的parentNode.replaceChild()的方法進(jìn)行替換;如果是排序的話,通過動態(tài)規(guī)劃的方法將其DOM上的元素進(jìn)行排列;如果有子節(jié)點(diǎn)的話,將其設(shè)置與真實(shí)DOM上相同的屬性,然后插入;如果是文本的話還需對瀏覽器做兼容處理,在IE瀏覽器上文本是放在node.nodeValue, 其他標(biāo)準(zhǔn)瀏覽器都是放在node.textContent
五、參考資料理解 Virtual DOM
深度剖析:如何實(shí)現(xiàn)一個 Virtual DOM 算法
Virtual DOM實(shí)現(xiàn)代碼
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/97295.html
摘要:具體而言,就是每次數(shù)據(jù)發(fā)生變化,就重新執(zhí)行一次整體渲染。而給出了解決方案,就是。由于只關(guān)注,通過閱讀兩個庫的源碼,對于的定位有了更深一步的理解。第二個而且,技術(shù)本身不是目的,能夠更好地解決問題才是王道嘛。 前言 React 好像已經(jīng)火了很久很久,以致于我們對于 Virtual DOM 這個詞都已經(jīng)很熟悉了,網(wǎng)上也有非常多的介紹 React、Virtual DOM 的文章。但是直到前不久...
摘要:但是它與里大部分的概率是保持一致的。但是如何將轉(zhuǎn)換成函數(shù)的調(diào)用呢就是干這件事情的。好了,讓我們看看是如何工作的。下面的圖片在流程圖中高亮了一個組件是如何工作的最后希望這篇文章能幫助你理解是如何工作的至少在中 英文原文鏈接 Virtual DOM很神奇,同時也比較復(fù)雜,難以理解。react,preact和相似的js庫都使用了virtual dom。然而,我找不到任何好的文章或者文檔,可以...
摘要:它是輕量級的,與特定于瀏覽器的實(shí)現(xiàn)細(xì)節(jié)分離。由于本身已經(jīng)是抽象,因此虛擬實(shí)際上是抽象的抽象。它允許在這個抽象的世界中進(jìn)行計(jì)算,并跳過真正的那些緩慢的操作。 前言 目前主流的前端框架React和Vue中都用到了Virtual DOM這個技術(shù),而Virtual DOM到底是什么,可能很多人和我一樣,概念上還是模糊。本文主要介紹DOM和Virtual DOM的基本概念及個人理解。 以下的D...
摘要:它是輕量級的,與特定于瀏覽器的實(shí)現(xiàn)細(xì)節(jié)分離。由于本身已經(jīng)是抽象,因此虛擬實(shí)際上是抽象的抽象。它允許在這個抽象的世界中進(jìn)行計(jì)算,并跳過真正的那些緩慢的操作。 前言 目前主流的前端框架React和Vue中都用到了Virtual DOM這個技術(shù),而Virtual DOM到底是什么,可能很多人和我一樣,概念上還是模糊。本文主要介紹DOM和Virtual DOM的基本概念及個人理解。 以下的D...
閱讀 2577·2023-04-26 02:18
閱讀 1325·2021-10-14 09:43
閱讀 3897·2021-09-26 10:00
閱讀 7373·2021-09-22 15:28
閱讀 2596·2019-08-30 15:54
閱讀 2667·2019-08-30 15:52
閱讀 549·2019-08-29 11:30
閱讀 3525·2019-08-29 11:05