最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue 虛擬DOM的原理

 更新時(shí)間:2020年10月03日 10:19:48   作者:guo&qi  
這篇文章主要介紹了vue 虛擬DOM的原理,幫助大家更好的理解和學(xué)習(xí)vue,感興趣的朋友可以了解下

為什么需要虛擬DOM?

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

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

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

  但是聰明的程序員不可能滿足于此,各種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)更新,可以說MVVM使得前端的開發(fā)效率大幅提升。但是其大量的事件綁定使得其在復(fù)雜場景下的執(zhí)行性能堪憂,有沒有一種兼顧開發(fā)效率和執(zhí)行效率的方案呢?由此引入Virtual DOM(虛擬DOM)。

  利用在內(nèi)存中生成與真實(shí)DOM與之對應(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 對象結(jié)構(gòu)表示 DOM 樹的結(jié)構(gòu);然后用這個(gè)樹構(gòu)建一個(gè)真正的 DOM 樹,插到文檔當(dāng)中;

  2.當(dāng)狀態(tài)變更的時(shí)候,重新構(gòu)造一棵新的對象樹。然后用新的樹和舊的樹進(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)。它通過js的Object對象模擬DOM中的節(jié)點(diǎn),然后再通過特定的render方法將其渲染成真實(shí)的DOM節(jié)點(diǎn) dom。diff 則是通過JS層面的計(jì)算,返回一個(gè)patch對象,即補(bǔ)丁對象,在通過特定的操作解析patch對象,完成頁面的重新渲染。

比較兩棵虛擬DOM樹的差異

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

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

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

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

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

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

// 1. 構(gòu)建虛擬DOM
var tree = el('div', {'id': 'container'}, [
  el('h1', {style: 'color: blue'}, ['simple virtal dom']),
  el('p', ['Hello, virtual-dom']),
  el('ul', [el('li')])
])

// 2. 通過虛擬DOM構(gòu)建真正的DOM
var root = tree.render()
document.body.appendChild(root)

// 3. 生成新的虛擬DOM
var 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)跨層級的移動(dòng)操作特別少,可以忽略不計(jì)。

  • 策略二(component diff):

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

  • 策略三(element diff):

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

tree diff

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

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

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

以上就是vue 虛擬DOM的原理的詳細(xì)內(nèi)容,更多關(guān)于vue 虛擬DOM的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue-router 基于后端permissions動(dòng)態(tài)生成導(dǎo)航菜單的示例代碼

    vue-router 基于后端permissions動(dòng)態(tài)生成導(dǎo)航菜單的示例代碼

    本文主要介紹了vue-router 基于后端permissions動(dòng)態(tài)生成導(dǎo)航菜單的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue使用monaco?editor漢化右鍵菜單示例

    vue使用monaco?editor漢化右鍵菜單示例

    這篇文章主要為大家介紹了vue使用?monaco?editor?漢化右鍵菜單實(shí)現(xiàn)漢化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù)

    van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù)

    前端開發(fā)想省時(shí)間就是要找框架呀,下面這篇文章主要給大家介紹了關(guān)于van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • vue使用el-table篩選tree樹形結(jié)構(gòu)的數(shù)據(jù)問題

    vue使用el-table篩選tree樹形結(jié)構(gòu)的數(shù)據(jù)問題

    這篇文章主要介紹了vue使用el-table篩選tree樹形結(jié)構(gòu)的數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • vue3搭配pinia的踩坑實(shí)戰(zhàn)記錄

    vue3搭配pinia的踩坑實(shí)戰(zhàn)記錄

    Pinia是一個(gè)同時(shí)支持Vue2和Vue3的應(yīng)用狀態(tài)管理工具,簡單來說就是為了管理整個(gè)應(yīng)用中的響應(yīng)式數(shù)據(jù),解決各個(gè)組件交互時(shí)數(shù)據(jù)狀態(tài)的不好管理的問題,下面這篇文章主要給大家介紹了關(guān)于vue3搭配pinia踩坑的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • VUE3引入html文件并傳值方法舉例

    VUE3引入html文件并傳值方法舉例

    這篇文章主要給大家介紹了關(guān)于VUE3引入html文件并傳值的相關(guān)資料,這是最近在項(xiàng)目中遇到了的一個(gè)需求,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 詳解vue-Resource(與后端數(shù)據(jù)交互)

    詳解vue-Resource(與后端數(shù)據(jù)交互)

    本篇文章主要介紹了vue-Resource(與后端數(shù)據(jù)交互),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • vue嵌入第三方頁面幾種常見方法

    vue嵌入第三方頁面幾種常見方法

    在Vue中嵌入第三方頁面可以采用多種方法,例如使用<iframe>、Vue插件、動(dòng)態(tài)加載第三方腳本或WebComponents,不同方法適用于不同類型的內(nèi)容和項(xiàng)目需求,如<iframe>適用于整個(gè)網(wǎng)頁,而動(dòng)態(tài)腳本和WebComponents適合特定功能,選擇合適的方法可以有效整合外部資源
    2024-09-09
  • Vue實(shí)現(xiàn)省市區(qū)三級聯(lián)動(dòng)

    Vue實(shí)現(xiàn)省市區(qū)三級聯(lián)動(dòng)

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)省市區(qū)三級聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • vue新建項(xiàng)目并配置標(biāo)準(zhǔn)路由過程解析

    vue新建項(xiàng)目并配置標(biāo)準(zhǔn)路由過程解析

    這篇文章主要介紹了vue新建項(xiàng)目并配置標(biāo)準(zhǔn)路由過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評論

杭锦后旗| 高雄市| 鹤壁市| 科尔| 昌邑市| 平和县| 沁水县| 丰宁| 连江县| 通道| 大石桥市| 清水县| 信阳市| 淮北市| 佛学| 景东| 常州市| 茶陵县| 兴义市| 兴和县| 兴和县| 北辰区| 咸宁市| 石门县| 信丰县| 临颍县| 平和县| 库伦旗| 河北省| 沙雅县| 荣昌县| 化隆| 辰溪县| 溧阳市| 丘北县| 麻栗坡县| 华容县| 宾阳县| 扶沟县| 自治县| 宁夏|