首頁 web前端 js教程 虛擬 DOM:React 快速 DOM 更新背後的技術。

虛擬 DOM:React 快速 DOM 更新背後的技術。

Oct 21, 2024 pm 08:42 PM

大家好,我很高興能夠開始一系列新的帖子,我將嘗試解釋程式設計世界中的各種概念。我們將涵蓋從冪等和慣用術語到與庫和框架相關的更具體概念的所有內容。今天,我們將深入探討這樣一個主題 - 虛擬 DOM.

如果您覺得這有幫助,請不要忘記按讚、分享和評論您希望我接下來介紹哪些主題。我們不要再浪費時間了,直接跳到虛擬 DOM!

注意:在我們繼續之前,重要的是要了解虛擬 DOM 的概念並不是 React 獨有的。其他 JavaScript 前端函式庫,例如 Vue,也使用它來增強渲染效能。

DOM

DOM(文件物件模型)是使用節點或物件的 HTML 文件(或網頁/Web 應用程式)的樹狀表示。 DOM 的設計使得前端函式庫和框架 (javascript) 可以透過其 API 以程式設計方式與文件互動和操作文件。

Virtual DOM: Technque behind React

為什麼選擇虛擬 DOM

雖然 DOM 提供了一種透過其 API 操作文件的有效方法,但當螢幕上有數千個元素時,效能可能會成為一個問題。這是因為 DOM 中的更新通常涉及銷毀和重新建立整個子樹。

這就是虛擬 DOM 發揮作用的地方。虛擬 DOM 是真實 DOM 的輕量級記憶體表示,允許快速有效地同步實際 DOM 的變更 - 這個過程稱為協調。

Virtual DOM: Technque behind React

這裡要記住的關鍵事項是:

  1. 虛擬 DOM 是 真實 DOM 的輕量級版本,這意味著它不具有真實 DOM 的所有屬性,這使得它的使用效率更高。
  2. 虛擬 DOM 存在於記憶體中,允許在將變更套用到真實 DOM 之前進行更快、更有效率的操作。

考慮到這一點,使用 DOM API 的 JavaScript 程式庫建立自己的虛擬 DOM 並操作它。他們僅在必要時更新 Real DOM,即使如此,也只需最少的操作。

React 中如何處理虛擬 DOM?

React JS 是 Facebook 開發的一個用於建立使用者介面的流行函式庫。由於其簡單性,它獲得了廣泛的流行並在許多現代 Web 專案中使用。

與許多其他 JS 前端函式庫一樣,React 使用虛擬 DOM 的概念來有效管理應用程式中的重新渲染和更新。

React 使用比較演算法以及協調技術來最佳化此流程。 (具體來說,ReactDOM 庫 在幕後處理此問題。)

讓我們一步一步分解:

  1. React 元件的 render() 函數

    • React 元件的 render() 函數首先使用 JSX 建立 React Element/Virtual DOM
    • 它包含 Real DOM 對應物的輕量級版本和額外屬性,例如 $$typeofprops,以促進高效比較。
  2. 比較演算法

    • 每當更新 React 元件時,就會建立一個新的 Virtual DOM,並開始比較過程。這是一個基於兩個關鍵假設的 O(n) 啟發式演算法
      1. 不同類型的元素會產生不同的樹。
      2. 關鍵道具可用於追蹤哪些子元素在渲染之間保持一致。

2.1。 比較演算法的步驟

  • 當演算法遇到兩種不同類型的 DOM 元素:它將拆除舊的 Virtual DOM,並根據新元素的規範從頭開始創建一個新的。
  • 當React遇到相同類型的DOM元素時:它保留舊的DOM對象,只更新更改的屬性。
  • 對於 相同類型的 React 元素,React 會保持舊 DOM 物件完整併提供更新的 props。
  • 處理子元素時,React 會迭代兩組子元素(舊的虛擬 DOM 樹和新建立的樹),在存在差異的地方進行更新。

2.2。 為什麼要使用鑰匙?

如上一點所述,比較演算法會迭代子列表並在必要時進行更改。如果您不使用子清單中的按鍵,效能可能會受到影響,並且您可能會遇到意外的行為。

讓我們來看看範例:

<ul> // old list
  <li>apple</li>
  <li>pineapple</li>
</ul>

<ul> // new list
  <li>apple</li>
  <li>pineapple</li>
  <li>grape</li>
</ul>
登入後複製
登入後複製

在上述場景中,演算法實際上可以有效地處理修改。它查看每個索引子項目並找到

  • apple
  • &
  • 菠蘿
  • 兩個列表中的內容相同,並且對它們沒有任何作用,而
  • grape
  • 僅出現在新清單中,因此將一個新增至舊清單。

    但是,我們想加入

  • 葡萄
  • 一開始。
    <ul> // old list
      <li>apple</li>
      <li>pineapple</li>
    </ul>
    
    <ul> // new list
      <li>apple</li>
      <li>pineapple</li>
      <li>grape</li>
    </ul>
    
    登入後複製
    登入後複製

    這裡,當演算法看到

  • 葡萄
  • 時,其效能將會下降。取代
  • 蘋果
  • 蘋果
  • 取代
  • 鳳梨
  • 和一個新的
  • 鳳梨
  • 在最後一個位置。從而重新建立 strach 中的所有元素。

    為了解決這個效能瓶頸,React 團隊使用了Key,它是附加到列表子項的唯一ID,演算法可以使用它來確定該項目是否可以完好無損,並且只需重新排序位置或需要重新建立。

    <ul> // old list
      <li>apple</li>
      <li>pineapple</li>
    </ul>
    
    <ul> // new list
      <li>grape</li>
      <li>apple</li>
      <li>pineapple</li>
    </ul>
    
    登入後複製

    現在,React 可以使用 Key 屬性,並且在新增子項目時僅重新定位未更新的子項。

    3) ReactDOM 的 render() 函數

    最後呼叫 ReactDOM 的 render() 函數,它協調了新的 Virtual DOM 和 Real DOM 之間的差異。這使得有效地重新渲染 HTML 所需的操作最少。

    結論

    在本文中,我們探索了虛擬 DOM,這是許多前端函式庫使用的一種技術,可以透過最少的 DOM 操作有效地處理資料和元素變更。我們也研究了 React 如何具體使用差異和協調流程來優化更新。

    我希望這篇文章可以幫助您更了解虛擬 DOM 的工作原理。即使您熟悉這個概念,我也希望現在您知道什麼是 Virtual DOM 以及它如何有助於創建優化的前端環境。

    以上是虛擬 DOM:React 快速 DOM 更新背後的技術。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱門文章

    <🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
    4 週前 By 尊渡假赌尊渡假赌尊渡假赌
    北端:融合系統,解釋
    4 週前 By 尊渡假赌尊渡假赌尊渡假赌
    Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Java教學
    1670
    14
    CakePHP 教程
    1428
    52
    Laravel 教程
    1329
    25
    PHP教程
    1276
    29
    C# 教程
    1256
    24
    Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

    Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

    從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

    從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

    JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

    JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

    JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

    JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

    了解JavaScript引擎:實施詳細信息 了解JavaScript引擎:實施詳細信息 Apr 17, 2025 am 12:05 AM

    理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

    Python vs. JavaScript:社區,圖書館和資源 Python vs. JavaScript:社區,圖書館和資源 Apr 15, 2025 am 12:16 AM

    Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

    Python vs. JavaScript:開發環境和工具 Python vs. JavaScript:開發環境和工具 Apr 26, 2025 am 12:09 AM

    Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

    C/C在JavaScript口譯員和編譯器中的作用 C/C在JavaScript口譯員和編譯器中的作用 Apr 20, 2025 am 12:01 AM

    C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

    See all articles