av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

vue 虛擬DOM的原理

瀏覽:115日期:2022-11-17 10:51:52

為什么需要虛擬DOM?

如果對(duì)前端工作進(jìn)行抽象的話,主要就是維護(hù)狀態(tài)和更新視圖,而更新視圖和維護(hù)狀態(tài)都需要DOM操作。其實(shí)近年來(lái),前端的框架主要發(fā)展方向就是解放DOM操作的復(fù)雜性。

運(yùn)行js的速度是很快的,大量的操作DOM就會(huì)很慢,時(shí)常在更新數(shù)據(jù)后會(huì)重新渲染頁(yè)面,這樣造成在沒(méi)有改變數(shù)據(jù)的地方也重新渲染了DOM 節(jié)點(diǎn),這樣就造成了很大程度上的資源浪費(fèi)。

在jQuery出現(xiàn)以前,我們直接操作DOM結(jié)構(gòu),這種方法復(fù)雜度高,兼容性也較差。有了jQuery強(qiáng)大的選擇器以及高度封裝的API,我們可以更方便的操作DOM,jQuery幫我們處理兼容性問(wèn)題,同時(shí)也使DOM操作變得簡(jiǎn)單。

但是聰明的程序員不可能滿足于此,各種MVVM框架應(yīng)運(yùn)而生,有angularJS、avalon、vue.js等,MVVM使用數(shù)據(jù)雙向綁定,使得我們完全不需要操作DOM了,更新了狀態(tài),視圖會(huì)自動(dòng)更新。更新了視圖數(shù)據(jù)狀態(tài)也會(huì)自動(dòng)更新,可以說(shuō)MVVM使得前端的開發(fā)效率大幅提升。但是其大量的事件綁定使得其在復(fù)雜場(chǎng)景下的執(zhí)行性能堪憂,有沒(méi)有一種兼顧開發(fā)效率和執(zhí)行效率的方案呢?由此引入Virtual DOM(虛擬DOM)。

利用在內(nèi)存中生成與真實(shí)DOM與之對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),這個(gè)在內(nèi)存中生成的結(jié)構(gòu)稱之為虛擬DOM 。

當(dāng)數(shù)據(jù)發(fā)生變化時(shí),能夠智能地計(jì)算出重新渲染組件的最小代價(jià)并應(yīng)用到DOM操作上。

Virtual DOM 算法

所謂的 Virtual DOM 算法。包括幾個(gè)步驟:

1.用 JavaScript 對(duì)象結(jié)構(gòu)表示 DOM 樹的結(jié)構(gòu);然后用這個(gè)樹構(gòu)建一個(gè)真正的 DOM 樹,插到文檔當(dāng)中;

2.當(dāng)狀態(tài)變更的時(shí)候,重新構(gòu)造一棵新的對(duì)象樹。然后用新的樹和舊的樹進(jìn)行比較,記錄兩棵樹差異;

3.把2所記錄的差異應(yīng)用到步驟1所構(gòu)建的真正的DOM樹上,視圖就更新了。

Virtual DOM 本質(zhì)上就是在 JS 和 DOM 之間做了一個(gè)緩存。可以類比 CPU 和硬盤,既然硬盤這么慢,我們就在它們之間加個(gè)緩存。

既然 DOM 這么慢,我們就在它們 JS 和 DOM 之間加個(gè)緩存。CPU(JS)只操作內(nèi)存(Virtual DOM),最后的時(shí)候再把變更寫入硬盤(DOM)。

所謂的virtual dom,也就是虛擬節(jié)點(diǎn)。它通過(guò)js的Object對(duì)象模擬DOM中的節(jié)點(diǎn),然后再通過(guò)特定的render方法將其渲染成真實(shí)的DOM節(jié)點(diǎn) dom。diff 則是通過(guò)JS層面的計(jì)算,返回一個(gè)patch對(duì)象,即補(bǔ)丁對(duì)象,在通過(guò)特定的操作解析patch對(duì)象,完成頁(yè)面的重新渲染。

vue 虛擬DOM的原理

比較兩棵虛擬DOM樹的差異

比較兩棵DOM樹的差異是 Virtual DOM 算法最核心的部分,這也是所謂的 Virtual DOM 的 diff 算法。

兩個(gè)樹的完全的 diff 算法是一個(gè)時(shí)間復(fù)雜度為 O(n^3) 的問(wèn)題。但是在前端當(dāng)中,你很少會(huì)跨越層級(jí)地移動(dòng)DOM元素。所以 Virtual DOM 只會(huì)對(duì)同一個(gè)層級(jí)的元素進(jìn)行對(duì)比:

vue 虛擬DOM的原理

上面的div只會(huì)和同一層級(jí)的div對(duì)比,第二層級(jí)的只會(huì)跟第二層級(jí)對(duì)比。這樣算法復(fù)雜度就可以達(dá)到 O(n)。

在實(shí)際的代碼中,會(huì)對(duì)新舊兩棵樹進(jìn)行一個(gè)深度優(yōu)先的遍歷,這樣每個(gè)節(jié)點(diǎn)都會(huì)有一個(gè)唯一的標(biāo)記,如下圖所示:

vue 虛擬DOM的原理

Virtual DOM 算法實(shí)現(xiàn)

Virtual DOM 算法得實(shí)現(xiàn)主要是用三個(gè)函數(shù):element,diff,patch。然后就可以實(shí)際的進(jìn)行使用,如下面代碼所示:

// 1. 構(gòu)建虛擬DOMvar tree = el(’div’, {’id’: ’container’}, [ el(’h1’, {style: ’color: blue’}, [’simple virtal dom’]), el(’p’, [’Hello, virtual-dom’]), el(’ul’, [el(’li’)])])// 2. 通過(guò)虛擬DOM構(gòu)建真正的DOMvar root = tree.render()document.body.appendChild(root)// 3. 生成新的虛擬DOMvar newTree = el(’div’, {’id’: ’container’}, [ el(’h1’, {style: ’color: red’}, [’simple virtal dom’]), el(’p’, [’Hello, virtual-dom’]), el(’ul’, [el(’li’), el(’li’)])])// 4. 比較兩棵虛擬DOM樹的不同var patches = diff(tree, newTree)// 5. 在真正的DOM元素上應(yīng)用變更patch(root, patches)

diff算法

用 三大策略 將O(n^3)復(fù)雜度 轉(zhuǎn)化為 O(n)復(fù)雜度

策略一(tree diff):

Web UI中DOM節(jié)點(diǎn)跨層級(jí)的移動(dòng)操作特別少,可以忽略不計(jì)。

策略二(component diff):

擁有相同類的兩個(gè)組件 生成相似的樹形結(jié)構(gòu),擁有不同類的兩個(gè)組件 生成不同的樹形結(jié)構(gòu)。

策略三(element diff):

對(duì)于同一層級(jí)的一組子節(jié)點(diǎn),通過(guò)唯一id區(qū)分。

tree diff

(1)通過(guò)updateDepth對(duì)Virtual DOM樹進(jìn)行層級(jí)控制。(2)對(duì)樹分層比較,兩棵樹只對(duì)同一層次節(jié)點(diǎn)進(jìn)行比較。如果該節(jié)點(diǎn)不存在時(shí),則該節(jié)點(diǎn)及其子節(jié)點(diǎn)會(huì)被完全刪除,不會(huì)再進(jìn)一步比較。(3)只需遍歷一次,就能完成整棵DOM樹的比較。

vue 虛擬DOM的原理

diff只簡(jiǎn)單考慮同層級(jí)的節(jié)點(diǎn)位置變換,如果是跨層級(jí)的話,只有創(chuàng)建節(jié)點(diǎn)和刪除節(jié)點(diǎn)的操作。

vue 虛擬DOM的原理

如上圖所示,以A為根節(jié)點(diǎn)的整棵樹會(huì)被重新創(chuàng)建,而不是移動(dòng),因此官方建議不要進(jìn)行DOM節(jié)點(diǎn)跨層級(jí)操作,可以通過(guò)CSS隱藏、顯示節(jié)點(diǎn),而不是真正地移除、添加DOM節(jié)點(diǎn)。

以上就是vue 虛擬DOM的原理的詳細(xì)內(nèi)容,更多關(guān)于vue 虛擬DOM的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 爱爱视频日本 | 国产精品亚洲综合 | 日日干干 | 欧美一区二区三区在线观看 | 黄网站免费在线观看 | 免费在线国产视频 | 成人免费小视频 | 三级高清 | 一级二级三级在线观看 | 亚洲日本中文字幕在线 | 国产成人精品久久 | 二区av| 免费观看一级毛片 | 久久久久久久久久毛片 | av毛片 | 色婷婷综合久久久中文字幕 | 免费看片在线播放 | 国产伦精品一区二区三区精品视频 | 日韩三级一区 | 中文字幕亚洲精品在线观看 | 成人精品国产一区二区4080 | 欧美日韩黄色一级片 | 操网站 | 国产97色| 亚洲国产福利视频 | 久在线视频播放免费视频 | 亚洲狠狠爱 | 欧美一级免费看 | www.成人在线视频 | 欧美视频免费在线观看 | 美女天天干 | 黑人成人网 | 欧美在线视频一区 | 波多野结衣在线观看一区二区三区 | 日韩精品在线观看视频 | 国产精品永久免费 | 男人天堂网址 | 国产精品久久久久久吹潮日韩动画 | 日韩国产专区 | 日日碰狠狠躁久久躁96avv | 水蜜桃亚洲一二三四在线 |