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

React中updateContainerImpl方法更新容器源碼解析

 更新時間:2026年01月26日 14:11:58   作者:Jinuss  
updateContainerImpl方法是React中更新容器的核心方法,負(fù)責(zé)創(chuàng)建和調(diào)度更新,通過createUpdate方法創(chuàng)建更新對象,并通過enqueueUpdate方法將其加入Fiber節(jié)點的更新隊列,本文介紹React中updateContainerImpl方法更新容器源碼分析,感興趣的朋友一起看看吧

概覽

ReactDOMRootrenderunmount方法中均調(diào)用了updateContainerImpl方法,該方法是React中更新容器的核心方法,負(fù)責(zé)創(chuàng)建和調(diào)度更新。

源碼分析

updateContainerImpl

updateContainerImpl方法源碼實現(xiàn)如下:

function updateContainerImpl(
  rootFiber, //根Fiber節(jié)點
  lane, // 更新優(yōu)先級
  element, //要渲染的React元素
  container, // Fiber根節(jié)點容器
  parentComponent, // 父組件
  callback // 更新完成后的回調(diào)函數(shù)
) {
  // 獲取子樹的上下文,會返回一個空對象
  parentComponent = getContextForSubtree(parentComponent);
  // 若Fiber根節(jié)點容器上下文為空,則設(shè)置其為獲取到的上下文(空對象);否則設(shè)置待處理的上下文為空對象
  null === container.context
    ? (container.context = parentComponent)
    : (container.pendingContext = parentComponent);
  // 根據(jù)優(yōu)先級車道創(chuàng)鍵更新對象  
  container = createUpdate(lane);
  // 將要渲染的React元素作為更新對像的載荷
  container.payload = { element: element };

  // 若回調(diào)未定義,則設(shè)為null,否則保留原值
  callback = void 0 === callback ? null : callback;
  // 若回調(diào)不為null,則將其設(shè)為更新對象的callback屬性值
  null !== callback && (container.callback = callback);
  
  // 將更新對象添加到Fiber節(jié)點的更新隊列,并獲取FiberRoot
  element = enqueueUpdate(rootFiber, container, lane);

  // 判斷 若返回的更新對象不為null,則調(diào)度更新
  null !== element &&
    (scheduleUpdateOnFiber(element, rootFiber, lane),
    entangleTransitions(element, rootFiber, lane));
}

createUpdate

createUpdate接受一個參數(shù)車道優(yōu)先級(lane),返回一個更新對象,其對象類型為UpdateUpdate會被放入更新隊列中等待調(diào)度執(zhí)行,其優(yōu)先級為參數(shù)lane,tagUpdateState:0,其實現(xiàn)如下:

function createUpdate(lane){
  return {
    lane: lane,  // 更新優(yōu)先級
    tag: UpdateState, // 其值為1 ,表示更新類型
    payload: null, // 更新載荷
    callback: null, // 回調(diào)函數(shù)
    next: null // 指向下一個更新
  }
}

enqueueUpdate

enqueueUpdate方法用于將更新對象加入Fiber節(jié)點的更新隊列,其源碼實現(xiàn)如下:

function enqueueUpdate(fiber, update, lane) {
  // 獲取Fiber節(jié)點上的更新隊列updateQueue
  var updateQueue = fiber.updateQueue;
  // 若更新隊列為空,則返回null,此時Fiber節(jié)點已被卸載
  if (null === updateQueue) return null;
  // 獲取共享隊列
  updateQueue = updateQueue.shared;

  // 檢查是否是渲染更新階段
  if (0 !== (executionContext & 2)) {
    // 獲取共享隊列的最后一個節(jié)點
    var pending = updateQueue.pending;
    // 判斷最后一個節(jié)點是否為空
    null === pending
      ? (update.next = update) // 將更新對象update的next指向自身
      : ((update.next = pending.next), (pending.next = update)); //否則將更新對象的next指向最后一個節(jié)點的next,并且將最后一個節(jié)點的next指向更新對象,即將更新對象插入到環(huán)形鏈表的末尾
    // 更新pending指針  
    updateQueue.pending = update;
    // 從Fiber節(jié)點中獲取FiberRoot
    update = getRootForUpdatedFiber(fiber);
    // 標(biāo)記fiber節(jié)點中的優(yōu)先級
    markUpdateLaneFromFiberToRoot(fiber, null, lane);
    // 最后返回FiberRoot
    return update;
  }
  // 若不是渲染更新階段,則依次執(zhí)行enqueueUpdate$1,getRootForUpdatedFiber,最后返回getRootForUpdatedFiber的結(jié)果FiberRoot
  // 調(diào)用enqueueUpdate$1方法就是將相關(guān)參數(shù)放到并發(fā)隊列concurrentQueues中
  enqueueUpdate$1(fiber, updateQueue, update, lane);
  return getRootForUpdatedFiber(fiber);
}

getRootForUpdatedFiber

Fiber節(jié)點的return始終是指向父節(jié)點,因此通過不斷追溯return可以找到根節(jié)點;

function getRootForUpdatedFiber(sourceFiber) {
  // 判斷某計數(shù)器,暫且不提
  if (50 < nestedUpdateCount)
    throw (
      ((nestedUpdateCount = 0),
      (rootWithNestedUpdates = null),
      Error(formatProdErrorMessage(185)))
    );
  for (var parent = sourceFiber.return; null !== parent; )
    (sourceFiber = parent), (parent = sourceFiber.return);
  
  // 判斷當(dāng)前Fiber節(jié)點的根節(jié)點類型是否為HostRoot,若是,則返回其DOM元素,否則返回null
  return 3 === sourceFiber.tag ? sourceFiber.stateNode : null;
}

scheduleUpdateOnFiber

調(diào)用enqueueUpdate方法更新相關(guān)隊列后,會拿到FiberRoot,若FiberRoot不為null,則調(diào)用scheduleUpdateOnFiber進(jìn)行調(diào)度更新。

entangleTransitions

entangleTranslations方法用于糾纏過渡更新,主要有3個作用:

  1. 將當(dāng)前更新與正在進(jìn)行的過渡更新糾纏
  2. 確保過渡更新的正確順序
  3. 處理并發(fā)模式下的更新沖突

到此這篇關(guān)于React中updateContainerImpl方法更新容器源碼解析的文章就介紹到這了,更多相關(guān)React updateContainerImpl更新容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React19 Diff 算法的具體實現(xiàn)

    React19 Diff 算法的具體實現(xiàn)

    本文主要介紹了React19 Diff 算法的具體實現(xiàn),該算法用于高效地更新虛擬DOM,它通過優(yōu)化傳統(tǒng)樹diff算法,將復(fù)雜度從O(n^3)降低到O(n),感興趣的可以了解一下
    2026-05-05
  • React 的虛擬 DOM 機(jī)制及原理解析

    React 的虛擬 DOM 機(jī)制及原理解析

    React的虛擬DOM機(jī)制通過在內(nèi)存中生成和比較虛擬DOM樹,實現(xiàn)了高效的渲染和性能優(yōu)化,是React框架的核心特點,本文給大家介紹React的虛擬DOM機(jī)制及原理解析,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • React使用Context的一些優(yōu)化建議

    React使用Context的一些優(yōu)化建議

    Context?提供了一個無需為每層組件手動添加?props,就能在組件樹間進(jìn)行數(shù)據(jù)傳遞的方法,本文為大家整理了React使用Context的一些優(yōu)化建議,希望對大家有所幫助
    2024-04-04
  • React插槽使用方法

    React插槽使用方法

    本文主要介紹了React插槽使用方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • ReactNative實現(xiàn)的橫向滑動條效果

    ReactNative實現(xiàn)的橫向滑動條效果

    本文介紹了ReactNative實現(xiàn)的橫向滑動條效果,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),補充介紹了ReactNative基于寬度變化實現(xiàn)的動畫效果,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • React-router v4 路由配置方法小結(jié)

    React-router v4 路由配置方法小結(jié)

    本篇文章主要介紹了React-router v4 路由配置方法小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • react中使用echarts,并實現(xiàn)tooltip循環(huán)輪播方式

    react中使用echarts,并實現(xiàn)tooltip循環(huán)輪播方式

    這篇文章主要介紹了react中使用echarts,并實現(xiàn)tooltip循環(huán)輪播方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • react render props模式實現(xiàn)組件復(fù)用示例

    react render props模式實現(xiàn)組件復(fù)用示例

    本文主要介紹了react render props模式實現(xiàn)組件復(fù)用示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • react裝飾器與高階組件及簡單樣式修改的操作詳解

    react裝飾器與高階組件及簡單樣式修改的操作詳解

    這篇文章主要介紹了react裝飾器與高階組件及簡單樣式修改的操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • react 父組件與子組件之間的值傳遞的方法

    react 父組件與子組件之間的值傳遞的方法

    本篇文章主要介紹了react 父組件與子組件之間的值傳遞的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

庆城县| 株洲县| 江永县| 正蓝旗| 常山县| 明水县| 太和县| 团风县| 通山县| 蒙自县| 乐山市| 晋江市| 广汉市| 休宁县| 农安县| 云阳县| 西藏| 铅山县| 临城县| 渝中区| 安远县| 师宗县| 湟源县| 鸡泽县| 广饶县| 临安市| 奉节县| 滕州市| 上蔡县| 无为县| 家居| 兴安县| 兴宁市| 东平县| 吉安市| 兰坪| 和静县| 观塘区| 铅山县| 江达县| 保亭|