最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React深入了解原理

 更新時(shí)間:2022年07月29日 15:39:58   作者:_語墨  
React是用于構(gòu)建用戶界面的JavaScript庫,?[1]??起源于Facebook的內(nèi)部項(xiàng)目,該公司對(duì)市場(chǎng)上所有?JavaScript?MVC框架都不滿意,決定自行開發(fā)一套,用于架設(shè)Instagram的網(wǎng)站

VDOM(虛擬dom)

react和vue都是基于vdom的前端框架。

web界面由DOM樹來構(gòu)建,當(dāng)其中一部分發(fā)生變化時(shí),其實(shí)就是對(duì)應(yīng)的某個(gè)節(jié)點(diǎn)發(fā)生了變化。

若一次操作中有十次更新DOM的動(dòng)作,虛擬DOM不會(huì)立即操作DOM,而是將這十次更新的diff內(nèi)容保存到本地的一個(gè)js對(duì)象中,最終將這個(gè)js對(duì)象一次性attach到DOM樹上,再進(jìn)行后續(xù)的操作。

用js對(duì)象模擬DOM節(jié)點(diǎn)的好處是:

  • 頁面的更新可以先全部反映在js對(duì)象(虛擬DOM)上,精準(zhǔn)的對(duì)比關(guān)心的屬性,避免大量無謂的計(jì)算。等更新完成后,再將最終的js對(duì)象映射成真是的DOM,交由瀏覽器去繪制。
  • 為應(yīng)用帶來的跨平臺(tái)的能力,不再僅僅局限于瀏覽器端。比如:React-Native、canvas等。
//虛擬dom對(duì)象
{
    type: 'div',
    props: {
        id: 'aaa',
        className: ['bbb', 'ccc'],
        onClick: function() {}
    },
    children: []
}

react中,jsx由babel轉(zhuǎn)義再經(jīng)過render后生成我們想要的VDOM(虛擬DOM)。

Fiber架構(gòu)

react15的時(shí)候,和 vue 的渲染流程還是很像的,都是遞歸渲染 vdom,增刪改 dom 就行。

但是因?yàn)闋顟B(tài)管理的差異導(dǎo)致了架構(gòu)的差異。react的setState會(huì)渲染整個(gè)vdom,而一個(gè)應(yīng)用的所有 vdom 可能是很龐大的,計(jì)算量就可能很大。

瀏覽器里 js 計(jì)算時(shí)間太長是會(huì)阻塞渲染的,會(huì)占用每一幀的動(dòng)畫、重繪重排的時(shí)間,這樣動(dòng)畫就會(huì)卡頓。

那能不能把計(jì)算量拆分一下,每一幀計(jì)算一部分,不要阻塞動(dòng)畫的渲染呢?

順著這個(gè)思路,react 就改造為了 fiber 架構(gòu),目標(biāo)是打斷計(jì)算,分多次進(jìn)行。

渲染的時(shí)候不要直接更新到 dom 了,只找到變化的部分,打個(gè)增刪改的標(biāo)記,創(chuàng)建好 dom,等全部計(jì)算完了一次性更新到 dom 就好了。

初始化渲染

根據(jù) React Element 生成對(duì)應(yīng)的 Fiber 樹

1.根據(jù) React Element 生成對(duì)應(yīng)的 Fiber 樹

首次執(zhí)行ReactDOM.render 會(huì)創(chuàng)建fiberRoot 和 rootFiber。

  1. fiberRoot:整個(gè)應(yīng)用的根節(jié)點(diǎn)(只能有一個(gè))
  2. rootFiber:組件樹的根節(jié)點(diǎn)(可以有多個(gè))

2.根據(jù)組件返回的JSX在內(nèi)存中依次創(chuàng)建Fiber節(jié)點(diǎn),并連接在一起構(gòu)建形成Fiber樹,被稱為workInProgress Fiber樹。最后以 workInProgress 作為最新的渲染樹,fiberRoot 的 current 指針指向 workInProgress 使其變?yōu)?current Fiber 樹。到此完成初始化流程。

  1. workInProgress:正在內(nèi)存中構(gòu)建的 Fiber 樹稱為 workInProgress Fiber樹。在一次更新中,所有的更新都是發(fā)生在 workInProgress 樹上。在一次更新之后,workInProgress 樹上的狀態(tài)是最新的狀態(tài),那么它將變成 current 樹用于渲染視圖。
  2. current:正在視圖層渲染的樹叫做 current 樹。

更新時(shí)

render階段,創(chuàng)建 dom,打上增刪改的 tag,等全部計(jì)算完之后,commit 階段一次性更新到 dom。

render階段

beginWork和completeWork階段會(huì)循環(huán)最新的jsx生成的虛擬dom,通過對(duì)比虛擬dom和current Fiber樹生成workinProgress Fiber樹。

beginWork

創(chuàng)建本次循環(huán)主體的子Fiber節(jié)點(diǎn)

  • mount(首屏渲染)時(shí)創(chuàng)建子Fiber節(jié)點(diǎn),并返回改新建節(jié)點(diǎn);
  • update時(shí)若不滿足復(fù)用條件,則與mount時(shí)一樣創(chuàng)建新的子fiber節(jié)點(diǎn),并diff出相應(yīng)的effTag掛在FIber節(jié)點(diǎn)上,并返回該新建節(jié)點(diǎn);
  • updata時(shí)若滿足復(fù)用條件,且判斷仍需處理其子節(jié)點(diǎn)的后代,則返回復(fù)用后的子Fiber節(jié)點(diǎn)
  • updata時(shí)若滿足復(fù)用條件,且判斷不需繼續(xù)處理其子節(jié)點(diǎn)的后代,則直接返回null值;

completeWork

構(gòu)建或更新DOM節(jié)點(diǎn)

  • 構(gòu)建過程中,會(huì)自下而上將子節(jié)點(diǎn)插入到當(dāng)前節(jié)點(diǎn)
  • 更新過程中,會(huì)計(jì)算DOM 節(jié)點(diǎn)的屬性,一旦屬性需要更新,會(huì)為DOM節(jié)點(diǎn)對(duì)應(yīng)的workINProgress節(jié)點(diǎn)標(biāo)記Update的effectTag

自下而上收集effectList,最終收集到root上

Diff到底是誰跟誰比?

Diff 是 vdom 和 current Fiber 對(duì)比,生成 workInProgressFiber

effectTag與effectList

render階段不會(huì)真正操作dom,只會(huì)創(chuàng)建dom然后打個(gè)effectTag的增刪改標(biāo)記。commit階段就根據(jù)標(biāo)記來更新dom就可以了。

但是commit階段要在遍歷一次fiber來查找有effectTag的節(jié)點(diǎn),更新dom嗎?

當(dāng)然沒問題,但是顯然很低效。完全可以把有 effectTag 的節(jié)點(diǎn)收集到一個(gè)鏈表里,然后 commit 階段直接遍歷這個(gè)鏈表就行了。這個(gè)鏈表叫做 effectList。

react 會(huì)在 commit 階段遍歷 effectList,根據(jù) effectTag 來增刪改 dom。

這個(gè)隊(duì)列叫做 effectList。

commit階段

render階段找到變化的部分,創(chuàng)建dom,打上增刪改的tag,等全部計(jì)算完之后,commit階段一次性更新到dom。

before mutation階段(執(zhí)行DOM操作前)

遍歷effectList,依次執(zhí)行:

1.處理DOM節(jié)點(diǎn)渲染/刪除后的autoFocus、blur邏輯

2.調(diào)用getSnapshotBeforeUpdate生命周期鉤子

3.調(diào)度useEffect mutation階段(執(zhí)行DOM操作)

遍歷 effectList 來更新 dom

layout階段(執(zhí)行DOM操作后)

因?yàn)檫@個(gè)階段已經(jīng)可以拿到布局信息了,會(huì)同步調(diào)用 useLayoutEffect 的回調(diào)函數(shù)。而且這個(gè)階段可以拿到新的 dom 節(jié)點(diǎn),還會(huì)更新下 ref。

到此這篇關(guān)于React深入了解原理的文章就介紹到這了,更多相關(guān)React原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于react useState更新異步問題

    關(guān)于react useState更新異步問題

    這篇文章主要介紹了關(guān)于react useState更新異步問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

    2022-08-08
  • React+Vite從零搭建項(xiàng)目及配置的實(shí)現(xiàn)

    React+Vite從零搭建項(xiàng)目及配置的實(shí)現(xiàn)

    本文主要介紹了React+Vite從零搭建項(xiàng)目及配置的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • ReactNative點(diǎn)擊事件.bind(this)操作分析

    ReactNative點(diǎn)擊事件.bind(this)操作分析

    這篇文章主要為大家介紹了ReactNative點(diǎn)擊事件.bind(this)操作分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • React學(xué)習(xí)筆記之列表渲染示例詳解

    React學(xué)習(xí)筆記之列表渲染示例詳解

    最近在學(xué)習(xí)React,學(xué)習(xí)到了列表渲染這一塊,發(fā)現(xiàn)網(wǎng)上這方面的資料較少,所以自己來總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于React學(xué)習(xí)筆記之列表渲染的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • react如何實(shí)現(xiàn)表格多條件搜索

    react如何實(shí)現(xiàn)表格多條件搜索

    這篇文章主要介紹了react如何實(shí)現(xiàn)表格多條件搜索問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • react.js 獲取真實(shí)的DOM節(jié)點(diǎn)實(shí)例(必看)

    react.js 獲取真實(shí)的DOM節(jié)點(diǎn)實(shí)例(必看)

    下面小編就為大家?guī)硪黄猺eact.js 獲取真實(shí)的DOM節(jié)點(diǎn)實(shí)例(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • 詳解React中如何獲取真實(shí)的dom

    詳解React中如何獲取真實(shí)的dom

    這篇文章主要為大家詳細(xì)介紹了React中獲取真實(shí)的dom的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • react-three-fiber實(shí)現(xiàn)炫酷3D粒子效果首頁

    react-three-fiber實(shí)現(xiàn)炫酷3D粒子效果首頁

    這篇文章主要介紹了react-three-fiber實(shí)現(xiàn)3D粒子效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • React服務(wù)端渲染和同構(gòu)的實(shí)現(xiàn)

    React服務(wù)端渲染和同構(gòu)的實(shí)現(xiàn)

    本文主要介紹了React服務(wù)端渲染和同構(gòu)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • react?express實(shí)現(xiàn)webssh?demo解析

    react?express實(shí)現(xiàn)webssh?demo解析

    這篇文章主要為大家介紹了詳解react?express實(shí)現(xiàn)webssh?demo解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論

墨竹工卡县| 社旗县| 青海省| 合作市| 阿尔山市| 钟山县| 高阳县| 汽车| 阳西县| 柘城县| 定远县| 会昌县| 周口市| 通化市| 林芝县| 工布江达县| 称多县| 荆州市| 杭锦旗| 开阳县| 西乌珠穆沁旗| 通州市| 白河县| 永州市| 永和县| 隆安县| 正定县| 庆云县| 富源县| 靖安县| 五家渠市| 蓝田县| 柳林县| 青冈县| 大渡口区| 潜山县| 景洪市| 东丰县| 松江区| 京山县| 望城县|