虛擬DOM

来源:https://www.cnblogs.com/liang-meng/archive/2019/10/30/11764403.html
-Advertisement-
Play Games

在說虛擬DOM之前,先來一個引子,從輸入url到展現出整個頁面都有哪些過程? 1、輸入網址 2、DNS解析 3、建立tcp連接 4、客戶端發送HTPP請求 5、伺服器處理請求 6、伺服器響應請求 7、瀏覽器展示HTML 8、瀏覽器發送請求獲取其他在HTML中的資源。 其中瀏覽器展示HTML經過了:構 ...


在說虛擬DOM之前,先來一個引子,從輸入url到展現出整個頁面都有哪些過程?

1、輸入網址

2、DNS解析

3、建立tcp連接

4、客戶端發送HTPP請求

5、伺服器處理請求 

6、伺服器響應請求

7、瀏覽器展示HTML

8、瀏覽器發送請求獲取其他在HTML中的資源。

其中瀏覽器展示HTML經過了:構建DOM樹,解析CSS構建CSSOM樹,DOM與CSSOM結合成為RenderObject樹,然後將RenderObject樹渲染成頁面(佈局->重繪),這個過程是由渲染引擎做的,JavaScript引擎與渲染引擎是獨立的,因為js可以操作dom,所以渲染引擎會暴露給js引擎一些介面來操作dom元素,這個通信過程的耗費是比較大的,所以在性能優化中會有一條:js儘量少操作dom元素,而虛擬DOM則是為瞭解決這一問題而出現。

當你用傳統的源生api或jQuery去操作DOM時,瀏覽器會從構建DOM樹開始從頭到尾執行一遍流程。比如當你在一次操作時,需要更新10個DOM節點,理想狀態是一次性構建完DOM樹,再執行後續操作。但瀏覽器沒這麼智能,收到第一個更新DOM請求後,並不知道後續還有9次更新操作,因此會馬上執行流程,最終執行10次流程。顯然例如計算DOM節點的坐標值等都是白白浪費性能,可能這次計算完,緊接著的下一個DOM更新請求,這個節點的坐標值就變了,前面的一次計算是無用功。

虛擬DOM就是為瞭解決這個瀏覽器性能問題而被設計出來的。例如前面的例子,假如一次操作中有10次更新DOM的動作,虛擬DOM不會立即操作DOM,而是將這10次更新的diff內容保存到本地的一個js對象中,最終將這個js對象一次性attach到DOM樹上,通知瀏覽器去執行繪製工作,這樣可以避免大量的無謂的計算量。

什麼是虛擬DOM?

Virtual DOM 是一種編程概念。在這個概念里, UI 以一種理想化的,或者說“虛擬的”表現形式被保存於記憶體中,並通過如 ReactDOM 等類庫使之與“真實的” DOM 同步。這一過程叫做協調

在某一時間節點調用 React 的 render() 方法,會創建一棵由 React 元素組成的樹。在下一次 state 或 props 更新時,相同的 render() 方法會返回一棵不同的樹。React 需要基於這兩棵樹之間的差別來判斷如何有效率的更新 UI 以保證當前 UI 與最新的樹保持同步。(Diffing演算法)

這種方式賦予了 React 聲明式的 API:您告訴 React 希望讓 UI 是什麼狀態,React 就確保 DOM 匹配該狀態。這使您可以從屬性操作、事件處理和手動 DOM 更新這些在構建應用程式時必要的操作中解放出來。

如何創建虛擬dom   

JSX就是在創建虛擬DOM,JSX就是React.createElement(component, props, ...children)的語法糖

<MyButton color="blue" shadowSize={2}>
  Click Me
</MyButton>

 會被babel轉譯成

React.createElement(
  MyButton,
  {color: 'blue', shadowSize: 2},
  'Click Me'
)

 React.createElement() 會預先執行一些檢查,以幫助你編寫無錯代碼,但實際上它創建了一個這樣的對象:

// 註意:這是簡化過的結構
const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world!'
  }
};

  也就是=》react元素

ReactDOM.render  把虛擬dom轉成真實dom,並且掛載


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天看到一個文說,富人存錢,窮人不存錢。這個觀點嚇我一跳,我還以為我搞錯了。 當我點進去閱讀後才發現,文章說的是富人原始積累是通過存錢而來,我才釋然。 窮人才喜歡存錢,富人不會存錢的。在最初階段,窮人和富人一樣,都通過賺錢積累第一筆財富,隨後差距便出現。 所謂的富人思維,就是用錢投資。窮人只會將錢 ...
  • 原始簡書文章地址(也是我自己的) 首先聲明,一我不負責涉及你們內部伺服器. 二是好好讀文章,別人能過,你們也能過 蘋果6月1日出的IPV6協議阻礙了國內大多數積極開發者,我司也不外乎,經過三次被拒後,遂在網上查找關於IPV6審核的相關事宜,怪我年少無知以為這種開源協議的東西應該是免費的,當然,我說的 ...
  • 一、浮動元素的字圍現象 我們可以看到​這裡的是:浮動+非浮動的模式,那麼這裡的浮動標簽就把非浮動的蓋住了一部分,有趣的是非浮動的裡面有文字,這裡面的文字就圍繞在了這個浮動標簽的周圍,這就是浮動的字圍效果,這裡可應用到圖文混排​。 二、我們做一次浮動的練習 註意:我們進行設計頁面的時候,通常在垂直方向 ...
  • CSS語法規範 1. CSS規則由兩個主要的部分構成:選擇器以及一條或多條聲明。 ~~~ p{ color: red; font size: 12px; } ~~~ CSS代碼風格 1. 樣式格式書寫 緊湊格式 ~~~ h3 {color: deeppink;font size:20px} ~~~ ...
  • 詞性說明 n :名詞 v : 動詞 vi :非及物動詞 vt :及物動詞 conj :連詞 prep :介詞 pron :代詞 adj :形容詞 adv :副詞 音頻 "0 100單詞點我" " 100 200單詞點我" "200 300單詞點我" 電腦專用英語辭彙常用單詞 file n.文件;v ...
  • axios學習筆記defaults(預設配置)和mergeConfig(合併config方法) "源碼地址" 找到入口文件 axios/lib/axios.js ... var mergeConfig = require('./core/mergeConfig');` var defaults = ...
  • 前段時間做了一個“國外的公眾號”,為什麼說是國外的公眾號呢,因為他和微信的公眾號有很多共通之處。當然了也有很多不同的地方,第一個要說的就是,我在列印信息的時候,使用的alert()彈窗,但是後臺才發現,LINE中的彈窗中的內容是不能用逗號分隔的。請看下麵的代碼: 在LINE中就只能列印個1,然後後面 ...
  • 序言 隨著用戶量越來越多,業務方關於用戶體驗的要求也在不斷提高,首屏渲染時間就成為了一個提高用戶體驗的指標,減少用戶等待的時間,在一定程度上就會提高用戶的留存。 頁面載入渲染是怎樣的一個過程 參考自Chrome的First Paint Send Request:表示給這個外鏈對應的伺服器發送請求 R ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...