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

react中commit工作流程

這篇具有很好參考價(jià)值的文章主要介紹了react中commit工作流程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

整個(gè)React工作流程可以分為兩大階段:

  • Render階段
    Schecule
    Reconcile

  • Commit階段
    注意,Render階段是在內(nèi)存中運(yùn)行的,這意味者可以被打斷,而commit階段一旦開(kāi)始同步執(zhí)行直到完成。

Renderer工作的階段被稱為commit階段。commit階段可以分為三個(gè)子階段:

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

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

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

其中上面的每個(gè)階段又分為三個(gè)子階段:
commit×××Effects
commit×××Effects_begin
commit×××Effects_complete

commit×××Effects:
該函數(shù)是每個(gè)子階段的入口函數(shù),finishedWor會(huì)作為firstChild參數(shù)傳進(jìn)去,相關(guān)代碼如下:

function commit×××Effects(root,firstChild){
nextEffects = firstChild;
// 省略標(biāo)記全局變量
commit×××Effects_begin();
// 省略重置全局變量
}

因此在該函數(shù)中,主要的工作是將firstChild賦值給全局變量nextEffects ,然后執(zhí)行commit×××Effects_begin。

commit×××Effects_begin:

向下遍歷FiberNode,遍歷的時(shí)候直到滿足如下條件之一的FiberNode:

  • 當(dāng)前的FiberNode的子FiberNode不包含該子階段對(duì)應(yīng)的flags;
  • 當(dāng)前的FiberNode不存在子FiberNode

接下來(lái)會(huì)對(duì)目標(biāo)FiberNode執(zhí)行commit×××Effects_complete方法。

commit×××Effects_complete:

該方法針對(duì)flags做具體的操作,主要包含以下三個(gè)步驟:

  • 對(duì)當(dāng)前FiberNode執(zhí)行flags對(duì)應(yīng)的操作,也就是執(zhí)行commit×××EffectsOnFiber
  • 對(duì)當(dāng)前FiberNode存在兄弟節(jié)點(diǎn),則對(duì)兄弟節(jié)點(diǎn)執(zhí)行commit×××Effects_begin
  • 如不存在兄弟FiberNode,則對(duì)父節(jié)點(diǎn)執(zhí)行commit×××Effects_complete

總結(jié)一下,每個(gè)階段都會(huì)以DFS原進(jìn)行遍歷,最終會(huì)在commit×××EffectsOnFiber針對(duì)不同的flags做出不同的處理。

before mutation階段:

before mutation階段的主要工作發(fā)生在commitBeforeMutationEffects_complete中的commitBeforeMutationEffectsOnFiber方法,這個(gè)方法主要是處理如兩種類型的FiberNode

  • ClassComponent:執(zhí)行g(shù)etSnapshotBeforeUpdate
  • HostRoot: 清空HostRoot掛載的內(nèi)容,方便mutation階段進(jìn)行渲染;

mutation階段:

對(duì)于HostComponent,mutation階段的主要工作是對(duì)Dom元素的增刪改查

刪除Dom元素

刪除dom的操作發(fā)生在commitMutationsEffects_begin方法中,首先會(huì)拿到deletions數(shù)組,然后遍歷該數(shù)組進(jìn)行刪除操作,對(duì)應(yīng)刪除dom的方法為commitDeletion

  commitDeletion(root, nextEffect, renderPriorityLevel);

commitDeletion內(nèi)部的完整邏輯還是比較復(fù)雜的,因?yàn)閯h除一個(gè)dom元素時(shí),不是刪除就刪除的,還需要考慮以下幾點(diǎn):

  • 其子樹(shù)中所有組件的unmount邏輯
  • 子樹(shù)中所有ref屬性的卸載操作
  • 其子樹(shù)中所有Effect相關(guān)的Hook的destory回調(diào)的執(zhí)行
<div>
<SomeClassComponent/>
<div ref={divRef}>
<SomeFunctionsComponents />
</div>
</div>

當(dāng)刪除最外層的div這個(gè)Dom元素時(shí),需要考慮:

  • 執(zhí)行SomeClassComponent類組件對(duì)應(yīng)的componentWillUnmount方法,
  • 執(zhí)行SomeFunctionsComponents 函數(shù)組件對(duì)應(yīng)的useEffect,useLayoutEffect這些hook中對(duì)應(yīng)的distory方法
  • divRef的卸載操作

整個(gè)刪除都是DFS順序,遍歷每個(gè)子樹(shù)的FiberNode,執(zhí)行對(duì)應(yīng)的操作

插入、移動(dòng)Dom元素

上面的刪除是在commitMutationsEffects_begin方法中執(zhí)行的,而插入和移動(dòng)dom元素是在commitMutationsEffects_complete中的commitMutationsEffectsOnFiber方法里面執(zhí)行的

Placement flag對(duì)應(yīng)的操作方法為CommitPlacement,整個(gè)CommitPlacement可以分為三個(gè)步驟:

  • 從當(dāng)前FiberNode向上遍歷,獲取第一個(gè)類型為HostComponent,HostRoot,HostPortal三者之一的祖先FiberNode,其對(duì)應(yīng)的Dom元素是執(zhí)行Dom操作的目標(biāo)元素的父級(jí)DOM元素;
  • 獲取用于執(zhí)行parentNode.insertBefore(child,before)方法before對(duì)應(yīng)的DOM元素;
  • 執(zhí)行parentNode.insertBefore方法(存在before)或者parentNode.appendChild方法(不存在before)

對(duì)于還沒(méi)有插入的DOM元素(對(duì)應(yīng)的就是mount場(chǎng)景),inserBefore會(huì)將目標(biāo)Dom元素插入到before之前,appendChild會(huì)將目標(biāo)DOM元素最為父DOM元素作為父DOM元素的最后一個(gè)子元素插入;

對(duì)于ui中已經(jīng)存在的DOM元素(對(duì)應(yīng)的就是mount場(chǎng)景),inserBefore會(huì)將目標(biāo)Dom元素移動(dòng)到before之前,appendChild會(huì)將目標(biāo)DOM元素移動(dòng)到同級(jí)最后

更新Dom元素

更新dom元素,最主要的工作是更新對(duì)應(yīng)的屬性,執(zhí)行的方法是commitWork;

其中變化的屬性會(huì)以key,value相鄰的形式存在FiberNode.updateQueue,最終在fiberNode.updateQueue里面所保存的要變化的屬性就會(huì)在一個(gè)名為updateDOMProperties方法被遍歷然后進(jìn)行處理,這里的處理主要是處理如下的四種數(shù)據(jù):

  • style屬性
  • innerHTML
  • 直接文本節(jié)點(diǎn)變化
  • 其他元素屬性
    當(dāng)mutations階段中的主要工作完成后,在進(jìn)入layout階段之前,會(huì)完成Fiber Tree的切換
root.current =  finishedWork

layout 階段

有關(guān)dom元素的操作在mutations中已經(jīng)結(jié)束了。

該階段主要工作幾種在commitLayoutEffectOnFiber方法中,在該方法內(nèi)部,會(huì)針對(duì)不同的FiberNode執(zhí)行不同的操作文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-826318.html

  • 對(duì)于ClassComponent,該階段執(zhí)行componentDidMount/update方法,
  • 對(duì)于FunctionComponent,該階段執(zhí)行useLayoutEffect的回調(diào)函數(shù)。

到了這里,關(guān)于react中commit工作流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 從javascript到vue再到react:前端開(kāi)發(fā)框架的演變

    從javascript到vue再到react:前端開(kāi)發(fā)框架的演變

    目錄 JavaScript: 動(dòng)態(tài)語(yǔ)言的基礎(chǔ) JavaScript:Web開(kāi)發(fā)的起點(diǎn) Vue.js: 漸進(jìn)式框架的興起 Vue.js:簡(jiǎn)潔、高效的前端框架 React.js: 聲明式UI的革新 React.js:強(qiáng)大、靈活的前端框架 演變之路與未來(lái)展望 演變過(guò)程 當(dāng)提到前端開(kāi)發(fā)中的框架時(shí),JavaScript、Vue.js和React.js是三個(gè)最常見(jiàn)的名詞。它

    2024年02月07日
    瀏覽(34)
  • JavaScript框架 Angular、React、Vue.js 的全棧解決方案比較

    JavaScript框架 Angular、React、Vue.js 的全棧解決方案比較

    在 Web 開(kāi)發(fā)領(lǐng)域,JavaScript 提供大量技術(shù)??晒┻x擇。其中最典型的三套組合,分別是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)進(jìn)行簡(jiǎn)化比較。 MERN 技術(shù)棧包含四大具體組件: MongoDB:一款強(qiáng)大的 NoSQL 數(shù)據(jù)庫(kù),以靈活的 JSON 格式存儲(chǔ)數(shù)據(jù)。 Express.js:一套極簡(jiǎn)但強(qiáng)大的

    2024年02月03日
    瀏覽(32)
  • TCP/IP協(xié)議工作原理與工作流程

    TCP/IP協(xié)議工作原理與工作流程

    使用OSI模型來(lái)描述一個(gè)網(wǎng)絡(luò)中的各個(gè)協(xié)議層,如下: TCP/IP協(xié)議,英文全稱Transmission Control Protocol/Internet Protocol,包含了一系列構(gòu)成互聯(lián)網(wǎng)基礎(chǔ)的網(wǎng)絡(luò)協(xié)議,是Internet的核心協(xié)議。TCP/IP協(xié)議是一個(gè)協(xié)議簇,包含了應(yīng)用協(xié)議、傳輸協(xié)議、網(wǎng)際互聯(lián)協(xié)議和路由控制協(xié)議。如下圖: 應(yīng)

    2024年04月25日
    瀏覽(38)
  • 2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比較

    2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比較

    ??歡迎來(lái)到Java學(xué)習(xí)路線專欄~探索2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比較 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁(yè):IT·陳寒的博客 ??該系列文章專欄:Java學(xué)習(xí)路線 ??其他專欄:Java學(xué)習(xí)路線 Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 ??文章作者技術(shù)和水

    2024年02月11日
    瀏覽(29)
  • 網(wǎng)絡(luò)安全等級(jí)保護(hù)測(cè)評(píng):工作流程及工作內(nèi)容

    網(wǎng)絡(luò)安全等級(jí)保護(hù)測(cè)評(píng):工作流程及工作內(nèi)容

    **一、** 網(wǎng)絡(luò)安全等級(jí)保護(hù)測(cè)評(píng)過(guò)程概述 網(wǎng)絡(luò)安全等級(jí)保護(hù)測(cè)評(píng)工作過(guò)程包括四個(gè)基本測(cè)評(píng)活動(dòng): 測(cè)評(píng)準(zhǔn)備活動(dòng)、方案編制活動(dòng)、現(xiàn)場(chǎng)測(cè)評(píng)活動(dòng)、報(bào)告編制活動(dòng) 。而測(cè)評(píng)相關(guān)方之間的溝通與洽談應(yīng)貫穿整個(gè)測(cè)評(píng)過(guò)程。每一項(xiàng)活動(dòng)有一定的工作任務(wù)。如下表。 01 基本工作流程

    2024年02月06日
    瀏覽(25)
  • AES工作流程

    工作流程 模式 1:加密 ? 復(fù)位EN 重置AES模塊 ? 設(shè)置模式寄存器mode[1:0]=00,設(shè)置流數(shù)據(jù)處理模式寄存器CHMOD[1:0] ? 寫(xiě)AES_KEYRx寄存器,CTR和CBC模式下寫(xiě)AES_IVRx寄存器 ? 寫(xiě)EN=1,使能AES ? 寫(xiě)AES_DINR 寄存器4次 ? 等待CCF標(biāo)志置起 ? 從AES_DOUTR分4次讀出加密結(jié)果 ? 對(duì)于同一個(gè)key,重

    2024年02月01日
    瀏覽(21)
  • SpringMVC的工作流程

    SpringMVC的工作流程

    SpringMVC的工作流程圖 SpringMVC的工作流程 1.?用戶通過(guò)客戶端向服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求會(huì)被 SpringMVC的前端控制器DispatcherServlet所攔截。 2.?DispatcherServlet攔截到請(qǐng)求后,會(huì)調(diào)用HandlerMapping處理器映射器。 3.?處理器映射器根據(jù)請(qǐng)求URL找到具體的處理器,生成處理器對(duì)象及處理器攔

    2024年01月24日
    瀏覽(53)
  • 機(jī)器學(xué)習(xí)工作流程

    機(jī)器學(xué)習(xí)工作流程

    機(jī)器學(xué)習(xí)的定義 機(jī)器學(xué)習(xí)的工作流程 獲取到的數(shù)據(jù)集的特性 1、什么是機(jī)器學(xué)習(xí) 機(jī)器學(xué)習(xí)是 從數(shù)據(jù)中自動(dòng)分析獲得模型,并利用模型對(duì)未知數(shù)據(jù)進(jìn)行預(yù)測(cè)。 2、機(jī)器學(xué)習(xí)工作流程 機(jī)器學(xué)習(xí)工作流程總結(jié) 1、獲取數(shù)據(jù) 2、數(shù)據(jù)基本處理 3、特征工程 4、機(jī)器學(xué)習(xí)(模型訓(xùn)練)

    2024年02月04日
    瀏覽(35)
  • 軟件測(cè)試工作流程

    軟件測(cè)試工作流程

    流程體系介紹 在以往的項(xiàng)目工作中,我參與過(guò),需求評(píng)審、測(cè)試計(jì)劃制定、測(cè)試用例編寫(xiě)、測(cè)試用例執(zhí)行、測(cè)試腳本編寫(xiě)、測(cè)試腳本的執(zhí)行,進(jìn)行回歸測(cè)試、驗(yàn)收測(cè)試、編寫(xiě)階段性測(cè)試報(bào)告等工作 需求分析,需求評(píng)審(RPD、產(chǎn)品原型圖) 制定測(cè)試計(jì)劃、評(píng)審測(cè)試計(jì)劃、優(yōu)化

    2024年02月05日
    瀏覽(24)
  • STM32 工作流程

    工作流程: 上電后,芯片復(fù)位啟動(dòng) MCU通過(guò)指令/數(shù)據(jù)總線從FLASH中讀取指令或數(shù)據(jù),配合解析執(zhí)行,然后再通過(guò)RAM和通用寄存器(R0~R12的內(nèi)部寄存器)處理可變數(shù)據(jù) 根據(jù)執(zhí)行的指令,配置和操作外設(shè)的寄存器,從而驅(qū)動(dòng)對(duì)應(yīng)的外設(shè)實(shí)現(xiàn)具體的功能 配合上層組合邏輯,結(jié)合外設(shè)

    2024年02月11日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包