精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入 Vue2.x 的虛擬 DOM diff 原理

云計算 虛擬化
Vue的diff算法與動態規劃算法中的經典案例“計算a到b的最小編輯距離”看上去有些相似,實際完全不同,Vue的diff相對來說輕量很多,感興趣的朋友可以查閱相關資料進行了解。

一、前言

Vue的核心是雙向綁定和虛擬DOM(下文我們簡稱為vdom),關于雙向綁定可以參閱木琴的文章《剖析Vue原理&實現雙向綁定MVVM》,vdom是樹狀結構,其節點為vnode,vnode和瀏覽器DOM中的Node一一對應,通過vnode的elm屬性可以訪問到對應的Node。

vdom因為是純粹的JS對象,所以操作它會很高效,但是vdom的變更最終會轉換成DOM操作,為了實現高效的DOM操作,一套高效的虛擬DOM diff算法顯得很有必要。

Vue的diff算法是基于snabbdom改造過來的,感興趣的朋友可以選擇查閱。

這是一張很經典的圖,出自《React’s diff algorithm》,Vue的diff算法也同樣,即僅在同級的vnode間做diff,遞歸地進行同級vnode的diff,最終實現整個DOM樹的更新。那同級vnode diff的細節又是怎樣的呢?正是本文所要講的。

二、例子

我們在下文中將使用這個簡化的例子來講述diff的過程

如上圖的例子,更新前是1到10排列的Node列表,更新后是亂序排列的Node列表。羅列一下圖中有以下幾種類型的節點變化情況:

(1)、頭部相同、尾部相同的節點:如1、10

(2)、頭尾相同的節點:如2、9(處理完頭部相同、尾部相同節點之后)

(3)、新增的節點:11

(4)、刪除的節點:8

(5)、其他節點:3、4、5、6、7

三、簡單的diff

簡單的diff算法可以這樣設計:

逐個遍歷newVdom的節點,找到它在oldVdom中的位置,如果找到了就移動對應的DOM元素,如果沒找到說明是新增節點,則新建一個節點插入。遍歷完成之后如果oldVdom中還有沒處理過的節點,則說明這些節點在newVdom中被刪除了,刪除它們即可。

仔細思考一下,幾乎每一步都要做移動DOM的操作,這在DOM整體結構變化不大時的開銷是很大的,實際上DOM變化不大的情況現實中經常發生,很多時候我們只需要變更某個節點的文本而已。

接下來我們看一下Vue的diff實現

四、Vue的diff實現

上圖例子中我畫上了oldStart+oldEnd,newStart+newEnd這樣2對指針,分別對應oldVdom和newVdom的起點和終點。起止點之前的節點是待處理的節點,Vue不斷對vnode進行處理同時移動指針直到其中任意一對起點和終點相遇。處理過的節點Vue會在oldVdom和newVdom中同時將它標記為已處理(標記方法后文中有介紹)。Vue通過以下措施來提升diff的性能。

(一)、優先處理特殊場景

(1)、頭部的同類型節點、尾部的同類型節點

這類節點更新前后位置沒有發生變化,所以不用移動它們對應的DOM

(2)、頭尾/尾頭的同類型節點

這類節點位置很明確,不需要再花心思查找,直接移動DOM就好

處理了這些場景之后,一方面一些不需要做移動的DOM得到快速處理,另一方面待處理節點變少,縮小了后續操作的處理范圍,性能也得到提升。

(二)、“原地復用”

“原地復用”是指Vue會盡可能復用DOM,盡可能不發生DOM的移動。Vue在判斷更新前后指針是否指向同一個節點,其實不要求它們真實引用同一個DOM節點,實際上它僅判斷指向的是否是同類節點(比如2個不同的div,在DOM上它們是不一樣的,但是它們屬于同類節點),如果是同類節點,那么Vue會直接復用DOM,這樣的好處是不需要移動DOM。再看上面的實例,假如10個節點都是div,那么整個diff過程中就沒有移動DOM的操作了。

“原地復用”在Vue的官方文檔中有提到,雖然帶來了好處,但是也會產生一些問題,朋友們可以復習一下

https://cn.vuejs.org/v2/guide/list.html#key

https://cn.vuejs.org/v2/guide/conditional.html#用-key-管理可復用的元素

五、按步解剖實例

(一)、整體視圖

先看一張整體視圖,整個diff分兩部分:

(1)、***部分是一個循環,循環內部是一個分支邏輯,每次循環只會進入其中的一個分支,每次循環會處理一個節點,處理之后將節點標記為已處理(oldVdom和newVdom都要進行標記,如果節點只出現在其中某一個vdom中,則另一個vdom中不需要進行標記),標記的方法有2種,當節點正好在vdom的指針處,移動指針將它排除到未處理列表之外即可,否則就要采用其他方法,Vue的做法是將節點設置為undefined。

(2)、循環結束之后,可能newVdom或者oldVdom中還有未處理的節點,如果是newVdom中有未處理節點,則這些節點是新增節點,做新增處理。如果是oldVdom中有這類節點,則這些是需要刪除的節點,相應在DOM樹中刪除之

整個過程是逐步找到更新前后vdom的差異,然后將差異反應到DOM樹上(也就是patch),特別要提一下Vue的patch是即時的,并不是打包所有修改***一起操作DOM(React則是將更新放入隊列后集中處理),朋友們會問這樣做性能很差吧?實際上現代瀏覽器對這樣的DOM操作做了優化,并無差別。

(二)、逐步解析

(1)、處理頭部的同類型節點,即oldStart和newStart指向同類節點的情況,如下圖中的節點1

這種情況下,將節點1的變更更新到DOM,然后對其進行標記,標記方法是oldStart和newStart后移1位即可,過程中不需要移動DOM(更新DOM或許是要的,比如屬性變更了,文本內容變更了等等)

(2)、處理尾部的同類型節點,即oldEnd和newEnd指向同類節點的情況,如下圖中的節點10

與情況(1)類似,這種情況下,將節點10的變更更新到DOM,然后oldEnd和newEnd前移1位進行標記,同樣也不需要移動DOM

(3)、處理頭尾/尾頭的同類型節點,即oldStart和newEnd,以及oldEnd和newStart指向同類節點的情況,如下圖中的節點2和節點9

先看節點2,其實是往后移了,移到哪里?移到oldEnd指向的節點(即節點9)后面,移動之后標記該節點,將oldStart后移1位,newEnd前移一位

操作結束之后情況如下圖

同樣地,節點9也是類似的處理,處理完之后成了下面這樣

(4)、處理新增的節點

newStart來到了節點11的位置,在oldVdom中找不到節點11,說明它是新增的

那么就創建一個新的節點,插入DOM樹,插到什么位置?插到oldStart指向的節點(即節點3)前面,然后將newStart后移1位標記為已處理(注意oldVdom中沒有節點11,所以標記過程中它的指針不需要移動),處理之后如下圖

(5)、處理更新的節點

經過第(4)步之后,newStart來到了節點7的位置,在oldVdom中能找到它而且不在指針位置(查找oldVdom中oldStart到oldEnd區間內的節點),說明它的位置移動了

那么需要在DOM樹中移動它,移到哪里?移到oldStart指向的節點(即節點3)前面,與此同時將節點標記為已處理,跟前面幾種情況有點不同,newVdom中該節點在指針下,可以移動newStart進行標記,而在oldVdom中該節點不在指針處,所以采用設置為undefined的方式來標記(一定要標記嗎?后面會提到)

處理之后就成了下面這樣

(6)、處理3、4、5、6節點

經過第(5)步處理之后,我們看到了令人欣慰的一幕,newStart和oldStart又指向了同一個節點(即都指向節點3),很簡單,按照(1)中的做法只需移動指針即可,非常高效,3、4、5、6都如此處理,處理完之后如下圖

(7)、處理需刪除的節點

經過前6步處理之后(實際上前6步是循環進行的),朋友們看newStart跨過了newEnd,它們相遇啦!而這個時候,oldStart和oldEnd還沒有相遇,說明這2個指針之間的節點(包括它們指向的節點,即上圖中的節點7、節點8)是此次更新中被刪掉的節點。

OK,那我們在DOM樹中將它們刪除,再回到前面我們對節點7做了標記,為什么標記是必需的?標記的目的是告訴Vue它已經處理過了,是需要出現在新DOM中的節點,不要刪除它,所以在這里只需刪除節點8。

在應用中也可能會遇到oldVdom的起止點相遇了,但是newVdom的起止點沒有相遇的情況,這個時候需要對newVdom中的未處理節點進行處理,這類節點屬于更新中被加入的節點,需要將他們插入到DOM樹中。

至此,整個diff過程結束了

Vue的diff算法與動態規劃算法中的經典案例“計算a到b的最小編輯距離”看上去有些相似,實際完全不同,Vue的diff相對來說輕量很多,感興趣的朋友可以查閱相關資料進行了解。

原文鏈接:https://www.qcloud.com/community/article/648055

作者:汪玉林

【本文是51CTO專欄作者“騰訊云技術社區”的原創稿件,轉載請通過51CTO聯系原作者獲取授權】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2022-05-06 07:19:11

DOMDiff算法

2021-04-02 11:24:22

Vue2.x雙向綁定前端

2021-06-25 06:47:38

VueVue2.x迷你版響應式原理

2020-10-20 18:42:17

Vue 3.0vue2.x數據

2025-05-08 02:10:00

Vue虛擬DOM

2024-09-11 16:49:55

2023-02-14 09:37:00

Vue無虛擬模式

2025-07-21 09:30:35

2025-09-03 09:03:22

2023-12-26 10:12:19

虛擬DOM數據

2019-07-01 13:34:22

vue系統數據

2022-06-28 15:13:12

Vuediff 算法

2024-02-06 10:55:47

2025-02-24 09:10:00

前端VueDOM

2025-05-23 09:21:10

VueDOM前端

2024-01-29 08:37:08

ReactVue前端

2021-01-18 07:15:22

虛擬DOM真實DOMJavaScript

2010-09-28 16:22:17

DOM樹

2010-09-28 13:24:34

DOM文檔對象模型

2010-09-28 09:22:34

DOM模型Html
點贊
收藏

51CTO技術棧公眾號

四虎成人免费视频| 日韩精品久久久免费观看 | 欧洲av不卡| 不卡视频在线看| 91高清视频免费| 亚洲女优在线观看| 精品国产不卡一区二区| 一区二区欧美国产| 蜜桃欧美视频| 国产男男gay体育生白袜| 综合久久婷婷| 日韩成人激情视频| 五月婷婷六月丁香激情| 成人午夜在线影视| 不卡在线视频中文字幕| 国自在线精品视频| 欧美做受高潮6| 91久久青草| 精品久久久久久| 日韩欧美在线一区二区| 91高潮大合集爽到抽搐| 亚洲欧洲一区| www.亚洲成人| 亚洲中文字幕一区| 久久精品国产精品亚洲毛片| 亚洲一区二区欧美| 亚洲五月六月| 婷婷av一区二区三区| 久久99最新地址| 国内精品久久久久久久| 性少妇xx生活| 色婷婷综合久久久久久| 69av一区二区三区| 那种视频在线观看| 18videosex性欧美麻豆| 国产视频一区在线播放| 国产精品一区二区三区精品| 最近中文字幕免费在线观看| 亚洲久久一区二区| 亚洲天堂久久av| 亚洲图片综合网| 国产成年精品| 欧美伊人久久久久久久久影院 | 国产成人综合精品在线| 九九视频免费看| 自拍偷拍一区| 亚洲精品一区二区三区福利| 五月天婷婷影视| 亚洲三级欧美| 亚洲国产sm捆绑调教视频| 亚洲欧美综合一区| 欧美另类自拍| 国产剧情av麻豆香蕉精品| 国产精品久久久久久久午夜| 国产区一区二区三| 樱桃成人精品视频在线播放| 久久中文字幕在线| 久久精品亚洲a| 日韩成人免费| 尤物精品国产第一福利三区| 三级男人添奶爽爽爽视频| 久久久国产精品入口麻豆| 欧美图片一区二区三区| 国产精品亚洲二区在线观看 | 久久综合伊人77777蜜臀| 免费看黄色aaaaaa 片| 成人性生交大片免费看96| 欧美成人三级在线| 午夜男人的天堂| 精品无人区一区二区| 亚洲精品短视频| 免费在线观看你懂的| 国产探花一区在线观看| 中文字幕成人精品久久不卡| 亚洲综合久久av一区二区三区| 国产精品久久久久无码av| 久久天天躁狠狠躁夜夜躁 | 国产在线你懂得| 中文字幕电影一区| 宅男av一区二区三区| 在线电影福利片| 欧美日韩国产黄| 国产精品人人妻人人爽人人牛| 青草综合视频| 精品久久久久久久久久久久久久久| 伊人网综合视频| 国模精品一区| 久久影院在线观看| 波多野结衣视频网站| 麻豆精品蜜桃视频网站| 春色成人在线视频| 韩国精品视频| 亚洲乱码日产精品bd| 欧美 日韩 亚洲 一区| 精品无人乱码一区二区三区 | 国产精品美女av| 国产高清在线观看视频| 久久综合国产精品| 椎名由奈jux491在线播放 | 色一情一伦一子一伦一区| xxww在线观看| 色哟哟精品丝袜一区二区| 日韩在线视频观看| 国产乡下妇女做爰视频| 九色综合国产一区二区三区| 国产区欧美区日韩区| 日韩免费网站| 欧美午夜影院在线视频| 视频区 图片区 小说区| 国产伦一区二区三区| 欧美夫妻性视频| 伊人网中文字幕| 97se亚洲国产综合在线| 国产成人免费高清视频| jizz久久久久久| 日韩精品在线观看一区二区| 粉嫩av性色av蜜臀av网站| 欧美亚洲视频| 99久久国产免费免费| 日韩子在线观看| 色偷偷久久一区二区三区| 亚洲一区二区三区三州| 日韩综合在线| 国产福利精品在线| 亚洲aaaaaaa| 亚洲国产视频直播| 四虎国产精品永久免费观看视频| 日韩免费在线| 国产精品九九九| 亚欧在线观看视频| 亚洲国产成人av网| 色悠悠在线视频| 夜间精品视频| 91久久精品美女| 无遮挡动作视频在线观看免费入口| 色综合久久六月婷婷中文字幕| 大尺度在线观看| 欧美xxx在线观看| 亚洲va欧美va国产综合剧情| 最新av网站在线观看| 在线亚洲免费视频| 中文字幕第20页| 久久综合影音| 欧美一区二区三区四区在线观看地址 | 成人免费观看a| 毛片免费不卡| 69p69国产精品| 少妇被躁爽到高潮无码文| 久久99精品国产91久久来源| 一区二区精品在线| 91精品麻豆| 欧美精品免费播放| 韩国av在线免费观看| 香蕉av福利精品导航| 麻豆精品国产传媒av| 亚洲美女毛片| 欧美成人第一区| 91p九色成人| 精品国内产的精品视频在线观看| 国产一区二区三区四区视频| 亚洲丝袜美腿综合| 肉丝美足丝袜一区二区三区四| 午夜日韩在线| 国产一区自拍视频| 亚洲精品动漫| 在线成人激情黄色| 一级做a爰片久久毛片16| 国产精品福利一区| 亚洲色图欧美自拍| 亚洲国产日本| 欧美极品日韩| 国产69精品久久久久按摩| 久久久99免费视频| 空姐吹箫视频大全| 色婷婷av一区二区三区软件| 手机av在线不卡| 国产一区不卡精品| 青青青青草视频| 国产精品羞羞答答在线观看| 国产中文日韩欧美| 超碰在线资源| 国产香蕉一区二区三区在线视频| 国产精品人人妻人人爽| 亚洲成人av资源| 国产一区二区三区四区在线| 国产精品18久久久久久久网站| 免费看日本毛片| 99久久精品国产亚洲精品| 国产精品99久久久久久久 | 午夜亚洲福利在线老司机| 色一情一乱一伦一区二区三区| 另类视频一区二区三区| 欧美亚洲日本黄色| av免费网站在线观看| 亚洲精品国产精品国自产观看浪潮 | 蜜桃视频在线观看www社区| 欧美va天堂va视频va在线| 一级黄色在线视频| 亚洲乱码国产乱码精品精可以看 | 91精品一区国产高清在线gif| 国产精品二区在线| 成人18视频在线观看| 久久久久国产一区二区三区| 成人免费黄色网页| 亚洲国产精久久久久久久| 一本色道久久综合亚洲| 精品久久久中文| 日韩在线观看视频一区二区| 91麻豆精东视频| 亚洲精品无码久久久久久久| 日本女人一区二区三区| 国产精品入口芒果| 99精品小视频| 欧美日韩综合久久| 国产精品22p| 91九色国产在线| 久久野战av| 91精品国产免费久久久久久 | 亚洲国产精品精华液网站| 91n在线视频| 久久人人97超碰com| 麻豆传媒在线看| 久久99国产精品久久99| 国产1区2区在线| 亚洲日本免费| 伊人久久在线观看| 中文字幕亚洲综合久久五月天色无吗'' | 中文字幕在线观看高清| 欧美视频在线观看 亚洲欧| 久久久久久久9999| 樱花草国产18久久久久| 天天色影综合网| 国产精品毛片无遮挡高清| 国产熟妇久久777777| 99精品热视频| 喷水视频在线观看| www.av精品| 亚洲av无码一区东京热久久| 久久精品国产999大香线蕉| 国产成人手机视频| 日韩精品1区2区3区| 蜜臀久久99精品久久久酒店新书 | 久久在线视频| 亚洲自拍的二区三区| 日韩.com| www亚洲国产| 亚洲深深色噜噜狠狠爱网站| 一区二区三区不卡在线| 91日韩免费| a级网站在线观看| 欧美aa国产视频| www污在线观看| 最新成人av网站| 青青草原成人网| 久久婷婷亚洲| 爱情岛论坛成人| 精品一区二区影视| 999久久久精品视频| 国产最新精品免费| 欧美性猛交乱大交| a在线欧美一区| 播金莲一级淫片aaaaaaa| 久久久久青草大香线综合精品| 国产精品无码久久久久久| 欧美国产精品一区二区| 三级黄色在线观看| 一区二区三区**美女毛片| 三级黄色在线视频| 日本韩国精品在线| 7777久久亚洲中文字幕| 日韩精品一区在线观看| 婷婷国产在线| 日韩中文综合网| ririsao久久精品一区| 欧美在线播放视频| 日韩免费在线电影| 激情五月综合色婷婷一区二区| 亚洲午夜久久| 一区二区三区我不卡| 今天的高清视频免费播放成人| 欧美日韩在线中文| 久久精品72免费观看| 逼特逼视频在线观看| 久久精品一区二区三区av| 手机在线中文字幕| 岛国av在线不卡| 国产精品视频在线观看免费| 欧美videossexotv100| 国产福利在线看| 欧美激情精品久久久久久| 澳门成人av网| 亚洲精品日韩激情在线电影| 天海翼亚洲一区二区三区| 亚洲高清乱码| 亚洲经典视频在线观看| 亚洲免费999| 91麻豆国产精品久久| 91高清免费观看| 色婷婷激情综合| 超碰在线观看av| 在线日韩中文字幕| 国产激情在线播放| 成人美女免费网站视频| 久久91麻豆精品一区| www插插插无码免费视频网站| 丝袜诱惑亚洲看片| 你懂的在线观看网站| 亚洲欧洲日本在线| 中文字幕免费观看| 日韩精品综合一本久道在线视频| 国产女人在线观看| 欧美一区在线直播| 97视频一区| 中文字幕欧美日韩一区二区| 老鸭窝91久久精品色噜噜导演| 亚洲精品久久久久久| 日本一区二区三区dvd视频在线| 久久精品波多野结衣| 欧美精品粉嫩高潮一区二区| 经典三级在线| 欧美一区二区视频97| 一级片久久久久| 国产精品视频免费看| 久久久久久久久久影院| 日韩一级片网站| 日本暖暖在线视频| 国产精品视频网站| 91精品国产自产在线丝袜啪| 亚洲精品8mav| 日韩成人免费电影| 国产精品1000部啪视频| 亚洲电影激情视频网站| 亚洲av永久无码国产精品久久| 久久精品成人一区二区三区| 国产成人免费精品| 午夜精品亚洲一区二区三区嫩草| 国产精品老牛| 韩国无码一区二区三区精品| 亚洲国产成人av好男人在线观看| 午夜精品久久久久久久96蜜桃| 欧美精品午夜视频| 亚洲经典视频| 成年丰满熟妇午夜免费视频| 国产精品一区在线| 青青草原在线免费观看视频| 欧美一区二区三区在线视频| 97超碰资源站在线观看| 91精品免费| 国产精品啊v在线| 日批在线观看视频| 精品国产乱码久久久久酒店 | 日韩五码在线观看| 懂色av一区二区三区蜜臀| 精品在线免费观看视频| 欧美日韩中文国产| 国产调教视频在线观看| 99r国产精品视频| av不卡在线| 国产精品美女高潮无套| 欧美日韩一区二区欧美激情 | 亚洲欧美日韩中文播放| 亚洲无码久久久久久久| 久久中文字幕在线视频| 1204国产成人精品视频| 成人中文字幕在线播放| 久久精品亚洲麻豆av一区二区| 欧美另类高清videos的特点| 久久九九亚洲综合| 2020最新国产精品| 黄色片久久久久| 中文字幕亚洲欧美在线不卡| www.日韩高清| 日本亚洲欧洲色| 欧美丰满日韩| 国产伦精品一区二区三区精品| 欧美日韩一二三四五区| 成年人在线观看网站| 2019国产精品视频| 美女精品在线| 亚洲波多野结衣| 日韩高清a**址| 黄色欧美视频| 久久久亚洲国产精品| 欧美激情一区二区三区不卡 | 99国产精品久久久久久久久久| 极品国产91在线网站| 久久国产精品久久久久| 久草在线综合| 亚洲天堂国产视频| 午夜欧美2019年伦理| 91高清在线| 国产在线欧美日韩| 久久se这里有精品| 超碰超碰超碰超碰| 中文字幕视频一区二区在线有码 | 欧美大片免费| 日韩一级特黄毛片| 国产精品亲子乱子伦xxxx裸| 少妇av在线播放| 国产一区二区丝袜高跟鞋图片|