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

vue中的虛擬dom知識點(diǎn)總結(jié)

 更新時間:2022年04月22日 11:14:59   作者:??SnowBall????  
這篇文章主要介紹了vue中的虛擬dom知識點(diǎn)總結(jié),文章圍繞主題內(nèi)容展開詳細(xì)介紹,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助

一、簡介

虛擬dom是隨著時代發(fā)展而誕生的產(chǎn)物。 命令式操作dom:

  • 簡單易用
  • 程序中的狀態(tài)很難管理,代碼中的邏輯也很混亂。

現(xiàn)在三大主流框架都是聲明式操作DOM。通過描述狀態(tài)和DOM之間的映射關(guān)系,就可以將狀態(tài)渲染成視圖。狀態(tài)可以是JS 中的任意類型。將狀態(tài)作為輸入,并生成DOM輸出到頁面上顯示出來的過程叫渲染。 通常程序在運(yùn)行時,狀態(tài)會不斷發(fā)生變化。狀態(tài)發(fā)生變化時,就需要重新渲染。 如何確定狀態(tài)中發(fā)生了什么變化以及需要在哪里更新DOM? 最簡單粗暴的解決方式:把所有DOM全刪了,使用狀態(tài)重新生成一份DOM,輸出到頁面上顯示出來。但是訪問dom是非常昂貴的,這樣會造成相當(dāng)多的性能浪費(fèi)。
虛擬DOM的解決方式:通過狀態(tài)生成虛擬節(jié)點(diǎn)樹,然后使用虛擬節(jié)點(diǎn)樹進(jìn)行渲染。在渲染之前,會對比新舊虛擬DOM,只渲染不同的部分。 虛擬DOM是將狀態(tài)映射為視圖的眾多解決方案中的一種。

二、為什么VUE引入了虛擬DOM?

vue在一定程度上知道具體哪個狀態(tài)發(fā)生了變化和哪些節(jié)點(diǎn)使用了這個狀態(tài),這樣就可以通過更細(xì)粒度的綁定來更新視圖。代價是粒度太細(xì)會有很多watcher同時觀察某些狀態(tài),會有一些內(nèi)存開銷以及一些依賴追蹤的開銷。vue2.0采取了一個中等粒度的解決方案,狀態(tài)偵測只細(xì)化到某個組件,組件內(nèi)部通過虛擬DOM渲染視圖,這可以大大縮減依賴數(shù)量和watcher數(shù)量。 vue通過模板描述狀態(tài)和視圖之間的映射關(guān)系,它會先將模板編譯成渲染函數(shù),然后執(zhí)行渲染函數(shù)生成虛擬節(jié)點(diǎn),使用虛擬節(jié)點(diǎn)更新視圖。
虛擬DOM在vue中的作用:
提供虛擬節(jié)點(diǎn)和對比新舊vnode,并根據(jù)對比結(jié)果進(jìn)行DOM操作來更新視圖。

三、vnode

VNode類可以實(shí)例化不同類型的vnode實(shí)例,而不同類型的vnode實(shí)例各自表示不同類型的DOM元素。vnode可以理解為節(jié)點(diǎn)描述對象,描述了應(yīng)該怎么創(chuàng)建真實(shí)DOM。

1.vnode的類型

  • 注釋節(jié)點(diǎn):只有兩個有效屬性:isComment屬性和text屬性
  • 文本節(jié)點(diǎn):只有text屬性
  • 元素節(jié)點(diǎn):tag,data(節(jié)點(diǎn)的數(shù)據(jù):如attrs、class、style等),children,context(當(dāng)前組件的vue實(shí)例)
  • 組件節(jié)點(diǎn):獨(dú)有屬性為componentOptions(組件節(jié)點(diǎn)的選項參數(shù)),componentInstance(組件實(shí)例)
  • 函數(shù)式組件:類似于組件節(jié)點(diǎn),獨(dú)有屬性為functionalContext和functionalOptions
  • 克隆節(jié)點(diǎn):將現(xiàn)有節(jié)點(diǎn)的屬性復(fù)制到新節(jié)點(diǎn)中,與被克隆節(jié)點(diǎn)的唯一區(qū)別是isCloned屬性,克隆節(jié)點(diǎn)的isCloned為true。作用是優(yōu)化靜態(tài)節(jié)點(diǎn)和插槽節(jié)點(diǎn)。

四、虛擬dom的核心——patch

可以將vnode渲染成真實(shí)的DOM,實(shí)際作用是計算出真正需要更新的節(jié)點(diǎn),在現(xiàn)有DOM上進(jìn)行修改來實(shí)現(xiàn)更新視圖的目的,最大限度減少DOM操作,顯著提升性能。本質(zhì)是用js的運(yùn)算成本替換DOM操作的執(zhí)行成本,js的運(yùn)算速度比DOM快得多,所以很劃算。

1.patch的過程

就是以新的vnode為準(zhǔn)增刪改節(jié)點(diǎn)。

新增節(jié)點(diǎn)

  • oldVnode不存在而vnode中存在。通常發(fā)生在首次渲染中。
  • vnode和oldVnode完全不是同一個節(jié)點(diǎn),vnode是新節(jié)點(diǎn),而oldVnode是被廢棄的節(jié)點(diǎn)。

刪除節(jié)點(diǎn)

  • 節(jié)點(diǎn)只在oldVnode中存在。

替換過程是將新創(chuàng)建的DOM節(jié)點(diǎn)插入到舊節(jié)點(diǎn)的旁邊,然后再將舊節(jié)點(diǎn)刪除。

更新節(jié)點(diǎn)

增刪節(jié)點(diǎn)的共同點(diǎn)是兩個虛擬節(jié)點(diǎn)完全不同。新舊節(jié)點(diǎn)是同一個文本節(jié)點(diǎn),需要進(jìn)行更細(xì)致的比對。

靜態(tài)節(jié)點(diǎn)

靜態(tài)節(jié)點(diǎn):一旦渲染到頁面上就不會變化。 如果新舊兩個虛擬節(jié)點(diǎn)時靜態(tài)節(jié)點(diǎn)就直接跳過更新節(jié)點(diǎn)。

新虛擬節(jié)點(diǎn)有文本屬性

新虛擬節(jié)點(diǎn)有文本屬性而且和舊節(jié)點(diǎn)文本屬性不一樣,就直接調(diào)用setTextContent方法(在瀏覽器環(huán)境下是node.textContent方法)來將視圖中DOM節(jié)點(diǎn)的內(nèi)容改為虛擬節(jié)點(diǎn)的text屬性所保存的文本。

新虛擬節(jié)點(diǎn)無文本屬性

新虛擬節(jié)點(diǎn)有children:

  • 舊虛擬節(jié)點(diǎn)也有children屬性,對新舊兩個虛擬節(jié)點(diǎn)的children進(jìn)行更詳細(xì)的對比并更新(增刪改移)。
  • 舊虛擬節(jié)點(diǎn)沒有children屬性,說明舊虛擬節(jié)點(diǎn)要么是一個空標(biāo)簽,要么是有文本的文本節(jié)點(diǎn)。如果是文本節(jié)點(diǎn),先把文本清空讓它變成空標(biāo)簽,然后將新虛擬節(jié)點(diǎn)(vnode)中的children挨個創(chuàng)建成真實(shí)的DOM元素節(jié)點(diǎn)并將其插入到視圖中的DOM節(jié)點(diǎn)下面。

新虛擬節(jié)點(diǎn)無children:

沒有text也沒有children,說明是空節(jié)點(diǎn)。把舊虛擬節(jié)點(diǎn)刪成空標(biāo)簽。

五、更新子節(jié)點(diǎn)的優(yōu)化策略

雙端對比。 只需要嘗試使用相同位置的兩個節(jié)點(diǎn)來比對是否是同一個節(jié)點(diǎn):如果恰巧是同一個節(jié)點(diǎn),直接就可以進(jìn)入更新節(jié)點(diǎn)的操作;如果嘗試失敗了,再用循環(huán)的方式來查找節(jié)點(diǎn)。這樣做可以很大程度地避免循環(huán)oldChildren來查找節(jié)點(diǎn),從而使執(zhí)行速度得到很大的提升。

  • oldChildren先循環(huán)完畢,如果newChildren中還有剩余的節(jié)點(diǎn),說明這些節(jié)點(diǎn)都是需要新增的節(jié)點(diǎn),直接把這些節(jié)點(diǎn)插入到DOM中就行了。
  • newChildren先循環(huán)完畢,、如果oldChildren還有剩余的節(jié)點(diǎn),、說明oldChildren中剩余的節(jié)點(diǎn)都是被廢棄的節(jié)點(diǎn),是應(yīng)該被刪除的節(jié)點(diǎn)。不需要循環(huán)對比就可以知道需要將這些節(jié)點(diǎn)從DOM中移除。

到此這篇關(guān)于vue中的虛擬dom知識點(diǎn)總結(jié)的文章就介紹到這了,更多相關(guān)vue中的虛擬dom內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中使用matomo進(jìn)行訪問流量統(tǒng)計的實(shí)現(xiàn)

    Vue中使用matomo進(jìn)行訪問流量統(tǒng)計的實(shí)現(xiàn)

    這篇文章主要介紹了Vue中使用matomo進(jìn)行訪問流量統(tǒng)計的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Vue+iview+webpack ie瀏覽器兼容簡單處理

    Vue+iview+webpack ie瀏覽器兼容簡單處理

    這篇文章主要介紹了Vue+iview+webpack ie瀏覽器兼容簡單處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Vue?elementui如何實(shí)現(xiàn)表格selection的默認(rèn)勾選

    Vue?elementui如何實(shí)現(xiàn)表格selection的默認(rèn)勾選

    這篇文章主要介紹了Vue?elementui如何實(shí)現(xiàn)表格selection的默認(rèn)勾選問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 詳解vue.js全局組件和局部組件

    詳解vue.js全局組件和局部組件

    這篇文章主要介紹了詳解vue.js全局組件和局部組件,實(shí)例分析了全局組件和局部的技巧,有興趣的可以了解一下。
    2017-04-04
  • npm install卡在“sill idealTree buildDeps“問題的兩種解決方法

    npm install卡在“sill idealTree buildDeps“問題的兩種解

    本文主要介紹了npm install卡在“sill idealTree buildDeps“問題的兩種解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Vue中使用eslint和prettier格式化代碼方式

    Vue中使用eslint和prettier格式化代碼方式

    這篇文章主要介紹了Vue中使用eslint和prettier格式化代碼方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue中動態(tài)權(quán)限到按鈕的完整實(shí)現(xiàn)方案詳解

    Vue中動態(tài)權(quán)限到按鈕的完整實(shí)現(xiàn)方案詳解

    這篇文章主要為大家詳細(xì)介紹了Vue如何在現(xiàn)有方案的基礎(chǔ)上加入對路由的增、刪、改、查權(quán)限控制,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • 淺談vue項目重構(gòu)技術(shù)要點(diǎn)和總結(jié)

    淺談vue項目重構(gòu)技術(shù)要點(diǎn)和總結(jié)

    這篇文章主要介紹了淺談vue項目重構(gòu)技術(shù)要點(diǎn)和總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • vue+antv實(shí)現(xiàn)雷達(dá)圖的示例代碼

    vue+antv實(shí)現(xiàn)雷達(dá)圖的示例代碼

    這篇文章主要介紹了vue+antv實(shí)現(xiàn)雷達(dá)圖,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Vue3中的ref和reactive響應(yīng)式原理解析

    Vue3中的ref和reactive響應(yīng)式原理解析

    這篇文章主要介紹了Vue3中的ref和reactive響應(yīng)式,本節(jié)主要介紹了響應(yīng)式變量和對象,以及變量和對象在響應(yīng)式和非響應(yīng)式之間的轉(zhuǎn)換,需要的朋友可以參考下
    2022-08-08

最新評論

博湖县| 会理县| 绥化市| 邢台市| 进贤县| 柳江县| 吉安县| 上虞市| 抚州市| 盐亭县| 耿马| 平塘县| 章丘市| 灵寿县| 三江| 武义县| 大理市| 石景山区| 福清市| 开原市| 三江| 加查县| 新蔡县| 休宁县| 舒兰市| 安宁市| 原阳县| 千阳县| 三亚市| 乐平市| 根河市| 永平县| 桓台县| 南涧| 得荣县| 上高县| 纳雍县| 南京市| 任丘市| 克拉玛依市| 小金县|