国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React原理 - React Virtual DOM 原理

這篇具有很好參考價值的文章主要介紹了React原理 - React Virtual DOM 原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

擴展學習資料

?Virtual DOM 是什么【虛擬dom】

React渲染

Virtual DOM VS 原生DOM【vDom是否比原生Dom更高效】

Virtual DOM數(shù)據(jù)結構

Virtaual DOM Diff【虛擬dom前后比對,更新不同dom的算法】

源碼解讀

react源碼組織方式:

React Stack Reconciler【react 棧 協(xié)調(diào)】

react v15.6.2 源碼

練習


擴展學習資料

名稱

鏈接

備注

Virtual DOM 定義

Virtual DOM and Internals – React

英文

Virtual DOM Node

Mithril.js

英文

VDom與 DOM 的區(qū)別

The difference between Virtual DOM and DOM - React Kung Fu

英文

React性能優(yōu)化:Virtual Dom原理淺析

[譯] React性能優(yōu)化:Virtual Dom原理淺析 - 掘金

[譯] Virtual Dom 和 Diff 算法

[譯] Virtual Dom 和 Diff 算法在 React 中是如何工作的? - 掘金

  • 比較前一個的內(nèi)部實例與下一個內(nèi)部實例
  • 更新內(nèi)部實例Virtual DOM(JavaScript對象) 中的組件樹結構。
  • 僅更新存在實際變化的節(jié)點及其子節(jié)點的真實DOM。

?Virtual DOM 是什么【虛擬dom】

虛擬DOM(virtualdom,VDOM)是一個編程概念,將UI的“虛擬”表示形式保存在內(nèi)存中,并通過ReactDOM之類的庫渲染成“真實”的DOM,這個過程叫做協(xié)調(diào)。

virtual dom將UI節(jié)點抽象成js對象

UI節(jié)點抽象:Virtual Dom對HTML Dom的抽象

Learn Once,Write Anywhere:因為提供了對HTML DOM的抽象,所以在Web開發(fā)中,通常不需要去調(diào)用DOM API。也是因為抽象,所以React也可以開發(fā)Native(React Native)?!究缙脚_性】

Virtual Dom構建UI

構建UI:以我們經(jīng)常見的Web開發(fā)為例,來看下React是怎么通過Virtual DOM渲染成HTML元素的。

React渲染

class App extends Component {
    state = {
        text: 'Virtual DOM',    
    }
    
    render() {
        const {text} = this.state;
        render (
            <div>{text}</div>        
        )    
    }
}

通過Virtual DOM 渲染頁面

很簡單的例子,渲染state遍歷text的值。

可以看到React是通過render方法渲染Virtual DOM(這里不考慮優(yōu)化),從而繪制出真實DOM。意味著,每次修改了state的值就會執(zhí)行render方法。

Virtual DOM是HTML DOM的映射,基本結構大致是一樣的

React原理 - React Virtual DOM 原理,React相關,react.js,javascript,ecmascript

?

Virtual DOM VS 原生DOM【vDom是否比原生Dom更高效】

  • 原生DOM更新
    • DOM API 調(diào)用更新UI
  • Virtual DOM更新
    • 每次render都會產(chǎn)生一份新的‘react dom’
    • Virtual DOM要對新舊‘react dom’進行比較,從而確定在舊‘dom’的基礎上進行多少變更
    • 確定最優(yōu)的變更策略之后調(diào)用DOM API更新UI

Virtual DOM渲染成HTML,在流程上會比原生DOM操作多幾個步驟

實際應用中,頁面的操作邏輯會比較復雜頻繁,多次頻繁操作Dom會導致頁面重繪,頁面重繪是影響頁面性能的關鍵指標,造成卡頓。react在內(nèi)部已經(jīng)做了考慮,所以說會比原生Dom更加高效

Virtual DOM數(shù)據(jù)結構

對UI節(jié)點抽象

在Virtual DOM中,對HTML節(jié)點進行抽象。用JS對象的形式表示HTML。

改變了過去對HTML節(jié)點的理解。

呈現(xiàn)在用戶面前的頁面就是一個復雜的遞歸對象。

const globaldom = {
    tagName: 'html',
    children: [
        {
            tagName: 'head',        
        }, {
            tagName: 'body',
            children: [{
                tagName: 'div',
                attributes: {
                     className: 'test'               
                }            
            }]        
        }    
    ]
}

Virtaual DOM Diff【虛擬dom前后比對,更新不同dom的算法】

  • Virtual DOM如何提高性能【高效更新】
  1. 我們將render產(chǎn)生的Virtual DOM簡稱‘Vdom’;
  2. 通常調(diào)用setState方法觸發(fā)Vdom更新;
  3. 通過對比新舊‘Vdom’,確定最優(yōu)實現(xiàn)新‘Vdom’所需的操作;
  • Virtual DOM Diff 的層次
    • 組件級別比較
    • 元素級別比較

HTML DOM是個完整的樹,常規(guī)樹遍歷的時間復雜度是n3,正是vdom對HTMLdom節(jié)點層次的劃分,使得HTML樹在Vdom中遍歷的時間復雜度降為n0這也是Vdom高效的原因之一。

Virtual DOM Diff是體現(xiàn)其性能/維護性的重要過程

  • Component Diff【組件級比較】:不同就直接開始替換組件及它的子組件(不再比對子組件)

React原理 - React Virtual DOM 原理,React相關,react.js,javascript,ecmascript?

  • 元素級別的比較【三個層面:創(chuàng)建、移動、刪除】

React原理 - React Virtual DOM 原理,React相關,react.js,javascript,ecmascript

  • 創(chuàng)建子節(jié)點

React原理 - React Virtual DOM 原理,React相關,react.js,javascript,ecmascript

?react源碼:diff 添加子節(jié)點

createChild: function (child, afterNode, mountImage) {
    return makeInsertMarkup(mountImage, afterNode, child._mountIndex);
},
  • 刪除子節(jié)點

React原理 - React Virtual DOM 原理,React相關,react.js,javascript,ecmascript

?react源碼:diff刪除子節(jié)點

removeChild: function (child, node) {
    return makeRenove(child, node);
},
  • 移動節(jié)點

React原理 - React Virtual DOM 原理,React相關,react.js,javascript,ecmascript

?react源碼:diff移動子節(jié)點【截取片段】

// 老節(jié)點和新節(jié)點相等,說明是移動
if(prevChild === nextChild) {
    updates = enqueue(updates, this.moveChild(prevChild, lastPlacedNode, nextIndex, lastIndex));
    lastIndex = Math.max(prevChild._mountIndex, lastIndex);
    prevChild._mountIndex = nextIndex;
}
moveChild: function (child, afterNode, toIndex, lastIndex) {
    // 原節(jié)點所在的掛載順序數(shù) < 更新后所在的順序數(shù)
    if (child._mountIndex < lastIndex) {
        return makeMove(child, afterNode, toIndex);    
    } else {
        // 不移動它,而是把它后面應該在前面的節(jié)點移動到它前面去    
    }
}

我們應該規(guī)避如圖示例,將最后一個節(jié)點移動到最前面。【這種操作顯得不那么高效】

react源碼比較復雜,不直觀【相對開發(fā)來說】;

react的移動、創(chuàng)建、刪除并不是在react包中實現(xiàn)的,而是在react dom這個包中實現(xiàn)的?!緞討B(tài)掛載技術】

?

源碼解讀

react源碼組織方式:

  1. 動態(tài)注入:react包源碼中只是聲明變量并沒有實現(xiàn),實現(xiàn)是寫在react dom包中【考慮到多平臺,把公共部分react抽了出來,react dom是個render器; react native是另一個render器;如公共方法setState,react中就只是定義;實現(xiàn)是在react dom、react native中實現(xiàn)各自的?!?/li>
  2. react dom中源碼:比如渲染HTML節(jié)點的時候,采用的是嵌套循環(huán)【渲染、更新、比較】(因為HTML樹本身就是一種循環(huán)嵌套的方式)

React Stack Reconciler【react 棧 協(xié)調(diào)】

render -> Virtual DOM Diff->commit【更新】

總結

1.Virtual DOM不僅僅是抽象了HTML Dom操作,更多的是抽象了UI節(jié)點,其次帶來一種編程理念:數(shù)據(jù)驅(qū)動視圖。

Virtual DOM本身的抽象性也使得跨平臺成為了可能。

2.如何看待VDom比原生Dom更加高效?

(1)高效的Diff算法實現(xiàn)更新

(2)可維護性和編程思維方面

react v15.6.2 源碼

練習

閱讀React源碼 ?React v15.6.2 重點閱讀 react-dom ReactMultiChild.js(react-dom/lib/ReactMultiChild.js) 源碼。

產(chǎn)出:文章來源地址http://www.zghlxwxcb.cn/news/detail-677635.html

  • 一份 Virtual DOM 與 HTML DOM 的對比圖;
  • 一份分析 Element 比較的流程圖。

到了這里,關于React原理 - React Virtual DOM 原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Node.js npm V8 React Express的運行配合關系:構建JavaScript應用的基石

    目錄 Node.js 和 V8 引擎 Node.js 和 npm LTS(Long Term Support) React Node.js的作用 Express Node.js 和 V8 引擎 Node.js 使用 Google 的 V8 JavaScript 引擎 來執(zhí)行 JavaScript 代碼。V8 是一個高性能的 JavaScript 和 WebAssembly 引擎,用于在 Google Chrome 瀏覽器和 Node.js 中運行 JavaScript。 V8 引擎的更新 通常包括

    2024年03月12日
    瀏覽(19)
  • React 路由react-router-dom詳解

    React 路由react-router-dom詳解

    前面我們先了解一下 路由是什么? 路由分類有哪些?內(nèi)置API有哪些 ? 可能有點枯燥,不喜歡看的直接跳過 ! 單頁Web應用(single page web application,SPA)。 整個應用只有一個完整的頁面。 點擊頁面中的鏈接不會刷新頁面,只會做頁面的局部更新。 數(shù)據(jù)都需要通過ajax請求獲取

    2023年04月11日
    瀏覽(22)
  • 面試題-React(二):React中的虛擬DOM是什么?

    一、什么是虛擬DOM? 虛擬DOM是React的核心概念之一,它是一個輕量級的JavaScript對象樹,用于表示真實DOM的狀態(tài)。在React中,當數(shù)據(jù)發(fā)生變化時,首先會在虛擬DOM上執(zhí)行DOM更新,而不是直接操作真實DOM。然后,通過比較前后兩個虛擬DOM的差異,最小化真實DOM的操作,從而減少頁

    2024年02月12日
    瀏覽(24)
  • 前端react入門day03-react獲取dom與組件通信

    前端react入門day03-react獲取dom與組件通信

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動力,如果看完對你有幫助,請留下您的足跡) 目錄 受控表單綁定? React中獲取DOM 組件通信 父傳子? 父傳子-基礎實現(xiàn) 父傳子-props說明 父傳子 - 特殊的prop children 子傳父? 使用狀態(tài)提升實現(xiàn)兄弟組件通信 使用Context機制跨

    2024年02月01日
    瀏覽(24)
  • React07-路由管理器react-router-dom(v6)

    React07-路由管理器react-router-dom(v6)

    react-router 是一個流行的用于 React 應用程序路由的庫。它使我們能夠輕松定義應用程序的路由,并將它們映射到特定的組件,這樣可以很容易地創(chuàng)建復雜的單頁面應用,并管理應用程序的不同視圖。 react-router 是基于 React 構建的,因此與其他 React 庫和工具集成得很好。它在許

    2024年02月02日
    瀏覽(20)
  • React基礎入門之虛擬Dom

    React基礎入門之虛擬Dom

    React官方文檔: https://react.docschina.org/ 重要提示:本系列文章基礎篇總結自尚硅谷課程,且采用類式寫法??!最新的函數(shù)式組件寫法見高級篇。 本系列文檔旨在幫助vue同學更快速的學習react,如果你很熟悉vue,且想更好地了解react,建議從 類式組件 學起! 學習本教程之前,最

    2024年02月11日
    瀏覽(17)
  • 面試題:React的真實DOM和虛擬DOM的區(qū)別

    真實DOM,就是文檔對象類型,在頁面上渲染的每一個節(jié)點都是一個真實DOM結構。 虛擬DOM,就是一個描述描述DOM結構的對象。 在創(chuàng)建虛擬DOM的目的就是為了更好將虛擬節(jié)點渲染到頁面上,虛擬DOM對象的節(jié)點與真實DOM的屬性是一一對應的。 在React中,ReactDOM.render()函數(shù)將虛擬DO

    2024年04月09日
    瀏覽(25)
  • React 18 使用 ref 操作 DOM

    參考文章 由于 React 會自動處理更新 DOM 以匹配渲染輸出,因此在組件中通常不需要操作 DOM。但是,有時可能需要訪問由 React 管理的 DOM 元素 —— 例如,讓一個節(jié)點獲得焦點、滾動它或測量它的尺寸和位置。在 React 中沒有內(nèi)置的方法來做這些事情,所以需要一個指向 DOM 節(jié)點

    2024年02月10日
    瀏覽(21)
  • 【React學習】—虛擬DOM兩種創(chuàng)建方式(二)

    【React學習】—虛擬DOM兩種創(chuàng)建方式(二)

    使用jsx創(chuàng)建虛擬DOM 使用js創(chuàng)建虛擬DOM 本質(zhì)是Object類型的對象(一般對象) 虛擬DOM比較輕,真實DOM比較重,因為虛擬DOM是React內(nèi)部在用 虛擬DOM最終會被React轉化為真實DOM,呈現(xiàn)在頁面上

    2024年02月14日
    瀏覽(23)
  • 277/300 React+react-router-dom+Vite 二級頁面刷新時,白屏問題解決

    BrowserRouter 換為 HashRouter

    2024年02月13日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包