1. 程式人生 > >【Vue原理】Diff

【Vue原理】Diff

寫文章不容易,點個讚唄兄弟 <br> <br> 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,白話版助於理解工作原理,原始碼版助於瞭解內部詳情,讓我們一起學習吧 研究基於 Vue版本 【2.5.17】

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧

【Vue原理】Diff - 白話版

終於到了最後一塊內容了!今天我們就來簡單概括一下 Diff,內容一點都不多哦,全是圖片

Diff 作為 Vue 比較重要的一部分內容,還是非常有必要深入瞭解的

此篇文章就會分幾塊內容進行簡單闡述,不會出現任何的原始碼,只是為了幫助大家建立一種思路,瞭解下 Diff 的大概內容

1、Diff 的作用

2、Diff 的做法

3、Diff 的比較邏輯

4、簡單的例子

下面就開始我們的正文


Diff 作用

Diff 的出現,就會為了減少更新量,找到最小差異部分DOM,只更新差異部分DOM就好了

這樣消耗就會小一些

資料變化一下,沒必要把其他沒有涉及的沒有變化的DOM 也替換了


Diff 做法

Vue 只會對新舊節點中 父節點是相同節點 的 那一層子節點 進行比較

也可以說成是

只有兩個新舊節點是相同節點的時候,才會去比較他們各自的子節點

最大的根節點一開始可以直接比較

這也叫做 同層級比較,並不需要遞迴,雖然好像降低了一些複用性,也是為了避免過度優化,是一種很高效的 Diff 演算法

新舊節點是什麼

所有的 新舊節點 指的都是 Vnode 節點,Vue 只會比較 Vnode 節點,而不是比較 DOM

因為 Vnode 是 JS 物件,不受平臺限制,所以以它作為比較基礎,程式碼邏輯後期不需要改動

拿到比較結果後,根據不同平臺呼叫相應的方法進行處理就好了

想了解 Vnode 更多資訊可以轉到這篇文章 VNode - 原始碼版

父節點是相同節點是什麼意思?

比如下圖出現的 四次比較(從 first 到 fouth),他們的共同特點都是有 相同的父節點

比如 藍色方的比較,新舊子節點的父節點是相同節點 1

比如 紅色方的比較,新舊子節點的父節點都是 2

所以他們才有比較的機會

公眾號

而下圖中,只有兩次比較,就是因為在 藍色方 比較中,並沒有相同節點,所以不會再進行下級子節點比較

公眾號


Diff 比較邏輯

Diff 比較的核心是 節點複用,所以 Diff 比較就是為了在 新舊節點中 找到 相同的節點

這個的比較邏輯是建立在上一步說過的同層比較基礎之上的

所以說,節點複用,找到相同節點並不是無限制遞迴查詢

比如下圖中,的確 舊節點樹 和 新節點樹 中有相同節點 6,但是然並卵,舊節點6並不會被複用

公眾號

就算在同一層級,然而父節點不一樣,依舊然並卵

公眾號

只有這種情況的節點會被複用,相同父節點 8

公眾號

下面說說 Diff 的比較邏輯

1、能不移動,儘量不移動

2、沒得辦法,只好移動

3、實在不行,新建或刪除

比較處理流程是下面這樣

在新舊節點中

1、先找到 不需要移動的相同節點,消耗最小

2、再找相同但是需要移動的節點,消耗第二小

3、最後找不到,才會去新建刪除節點,保底處理

比較是為了修改DOM 樹

其實這裡存在 三種樹,一個是 頁面DOM 樹,一個是 舊VNode 樹,一個是 新 Vnode 樹

頁面DOM 樹 和 舊VNode 樹 節點一一對應的

而 新Vnode 樹則是表示更新後 頁面DOM 樹 該有的樣子

這裡把 舊Vnode 樹 和 新Vnode樹 進行比較的過程中

不會對這兩棵Vode樹進行修改,而是以比較的結果直接對 真實DOM 進行修改

比如說,在 舊 Vnode 樹同一層中,找到 和 新Vnode 樹 中一樣但位置不一樣節點

此時需要移動這個節點,但是不是移動 舊 Vnode 樹 中的節點

而是 直接移動 DOM

總的來說,新舊 Vnode 樹是拿來比較的,頁面DOM 樹是拿來根據比較結果修改的

如果你有點懵,我們就來就簡單說個例子


Diff 簡單例子

比如下圖存在這兩棵 需要比較的新舊節點樹 和 一棵 需要修改的頁面 DOM樹

公眾號

第一輪比較開始

因為父節點都是 1,所以開始比較他們的子節點

按照我們上面的比較邏輯,所以先找 相同 && 不需移動 的點

毫無疑問,找到 2

公眾號

拿到比較結果,這裡不用修改DOM,所以 DOM 保留在原地

公眾號

第二輪比較開始

然後,沒有 相同 && 不需移動 的節點 了

只能第二個方案,開始找相同的點

找到 節點5,相同但是位置不同,所以需要移動

公眾號

拿到比較結果,頁面 DOM 樹需要移動DOM 了,不修改,原樣移動

公眾號

第三輪比較開始

繼續,哦吼,相同節點也沒得了,沒得辦法了,只能建立了

所以要根據 新Vnode 中沒找到的節點去建立並且插入

然後舊Vnode 中有些節點不存在 新VNode 中,所以要刪除

公眾號

於是開始建立節點 6 和 9,並且刪除節點 4 和 5

公眾號

然後頁面就完成更新啦

怎麼樣,有沒有感興趣,感興趣就看原始碼吧哈哈

後面的就會出原始碼版啦

最後

鑑於本人能力有限,難免會有疏漏錯誤的地方,請大家多多包涵,如果有任何描述不當的地方,歡迎後臺聯絡本人,有重謝

相關推薦

Vue原理Diff

寫文章不容易,點個讚唄兄弟 <br> <br> 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,

Vue原理Watch

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Watch - 原始碼版 今天繼續探索 Watch 原始碼,廢話不多說了 帶著我的幾個疑問開始 1、什麼時候初始化 2、怎麼確定監聽哪些值 3、深度監聽怎麼回事 4、怎麼觸發我的函式 這些問題的答案會摻

Vue原理Props

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Props - 原始碼版 今天記錄 Props 原始碼流程,哎,這東西,就算是研究過了,也真是會隨著時間慢慢忘記的。 幸好我做了詳細的文章,忘記了什麼的,回憶起來必然是很快的。 好的,回到正題,Props 請你

Vue原理Mixins

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Mixins - 原始碼版 今天探索的是 mixins 的原始碼,mixins 根據不同的選項型別會做不同的處理 篇幅會有些長,你知道的,有很多種選項型別的嘛,但不是很難。只是涉及原始碼難免會有些煩, 不過這篇文

Vue原理依賴更新

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】依賴更新 - 原始碼版 如果對依賴收集完全沒有概念的同學,可以先看我這篇白話版 響應式原理 - 白話版 我們已經講過了 依賴收集 【Vue原理】依賴收集 - 原始碼版之基本資料型別 【Vue

Vue原理VNode

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】VNode - 原始碼版 今天就來探索 VNode 的原始碼,VNode 是 Vue2 渲染機制中很重要的一部分,是深入Vue 必須瞭解的部分 我們以4個問題來開始我們的探索 1、vnode 是什麼及其作用

Vue原理Event

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Event - 原始碼版 之 自定義事件 Vue 的自定義事件很簡單,就是使用 觀察者模式 進行事件的監聽和分發 Vue 封裝的這個觀察者模式,可以說是很完善了,這個可以獨立抽取出來的在其他專案中使用的程式碼,

Vue原理NextTick

寫文章不容易,點個讚唄兄弟 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,白話版助於理解工作原理,原始碼版助於瞭解內部詳

Vue原理Render

寫文章不容易,點個讚唄兄弟 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,白話版助於理解工作原理,原始碼版助於瞭解內部詳

vue.js入門

emp 寫到 logs 組件 images href one mooc 渲染 慕課網視頻學習筆記:http://www.imooc.com/learn/694 1.將html、js、css寫到一個後綴名.vue的文件中,區分這三種類型是通過<template>、

底層原理四位計算機的原理及其實現

一點 led燈 waiting lean div rm2 src and nvt 你是否想過,計算機為什麽會加減乘除?或者更直接一點,計算機的原理到底是什麽? Waitingforfriday有一篇詳細的教程,講解了如何自己動手,制作一臺四位計算機。從中可以看到,二進制、數

計算機原理程序執行過程

進程 cnblogs div 空間 時間片 chat 內存管理 tro alt 本章主要介紹程序執行過程中操作系統、CPU都幹了什麽 運行前 程序在運行前,只是在硬盤上待著,此時就是一堆二進制代碼而已,沒有任何作用。 程序只有進入了內存才能運行,但是要進入內存,則需要服從操

計算機原理CPU部分.md

工作 信號 通過 臃腫 流水線 處理 2.6 操作 ade 本文由CPU阿甘改編而得,主要講的是系統啟動和程序執行時CPU做的工作。 CPU的構成 中央處理器(CPU,Central Processing Unit)由運算器、控制器、Cache等。 控制器:主要是對指令進

組成原理第一章 計算機系統概述

表示 運算 傳遞 intro 指令 掌握 周期 style 主存 重點掌握:MAR和MDR的含義,主存容量大小、CPU執行時間的計算,性能指標CPI、MIPS、主頻等等。 1. 存儲單元:CPU訪問存儲器的基本單位,每個單元有一個地址。通常是字節大小的整數倍。 2. CPU

編譯原理c++實現自下而上語法分析器

不可 acm times style size PC -i 表達式 鏈接 寫在前面:本博客為本人原創,嚴禁任何形式的轉載!本博客只允許放在博客園(.cnblogs.com),如果您在其他網站看到這篇博文,請通過下面這個唯一的合法鏈接轉到原文! 本博客全網唯一合法URL:ht

計數原理UVA11538 Chess Queen

put typename return col nbsp 題意 putchar cst putc 傳送門 Description   給你一個n*m的棋盤,在棋盤上放置一黑一白兩個皇後,求兩個皇後能夠互相攻擊的方案個數 Input   多組數據,每組數據包括:

MongoDB 復制集 第 二 部 之選舉原理

command primary red and 優先權 mongo mongodb 主機 set 目錄: 1·復制與選舉的原理與驗證2·oplog 日誌調整3·配置復制集的優先級4·部署認證的復制5·總結 復制與選舉的原理: 上一篇文章搭建了多臺實例,部署成復制集,

Memcached 主主復制 + Keepalived 高可用架構附上原理

ima pki nag ali event 主服務器 figure tel outer 目錄: 1·Memcached 主主復制概念2·Memcached 高可用的實現3·案例部署4·總結 Memcached 主主復制概念 (1)主主復制概念: Memcached

Windows原理非同步IO-_APC(非同步過程呼叫)

// 同步IO的缺點是, 在讀寫檔案時, 如果檔案太大, 或者讀寫的時間太長, 就會在讀寫函式中 // 阻塞住. // 非同步IO解決了這個問題, 非同步IO讀寫檔案時, 檔案再大也不會阻塞住 // 但是非同步IO要完成這樣的特性是有一點付出的 // 非同步讀寫檔案後, 需要通過一些方式

Windows原理IO非同步-等待事件物件

/* 同步IO的缺點是, 在讀寫檔案時, 如果檔案太大, 或者讀寫的時間太長, 就會在讀寫函式中 阻塞住. 非同步IO解決了這個問題, 非同步IO讀寫檔案時, 檔案再大也不會阻塞住 但是非同步IO要完成這樣的特性是有一點付出的 非同步讀寫檔案後, 需要通過一些方式才能知道檔案讀寫(IO