国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一圖看懂 React 源碼中的同步更新邏輯

開發 前端
同步更新的過程比較簡單,從 ScheduleUpdateOnFiber 到 BeginWork 這中間的流程里,大多數邏輯都在進行各種不同情況的判斷,因此源碼看上去比較吃力,實際邏輯并不是很重要,簡單了解即可。

在 React 源碼中,scheduleUpdateOnFiber 是所有任務的唯一入口方法。我們前面分析 useState 的實現原理章節中,我們可以清晰的知道,當我們調用 dispatchSetState 時,最終會調用該入口方法。

scheduleUpdateOnFiber 主要用于觸發一個 Fiber 節點上的調度更新任務,該函數里主要有兩個核心邏輯。

// Mark that the root has a pending update.
// 標記 root 上有一個更新任務
markRootUpdated(root, lane, eventTime);

ensureRootIsScheduled(root, eventTime);

markRootUpdated 的邏輯如下,簡單了解一下即可。

export function markRootUpdated(
  root: FiberRoot,
  updateLane: Lane,
  eventTime: number,
) {

  // 設置本次更新的優先級
  root.pendingLanes |= updateLane;

  // 重置 root 應用根節點的優先級
  if (updateLane !== IdleLane) {  
    // 由 Suspence 而掛起的 update 對應的 lane 集合
    root.suspendedLanes = NoLanes; 
    // 由請求成功,Suspence 取消掛起的 update 對應的 Lane 集合
    root.pingedLanes = NoLanes; 
  }

  const eventTimes = root.eventTimes;
  const index = laneToIndex(updateLane);
  eventTimes[index] = eventTime;
}

ensureRootIsScheduled 的主要目的要確保 root 根節點被調度。在該邏輯中,會根據 root.pendingLanes 信息計算出本次更新的 Lanes: nextLanes。

const nextLanes = getNextLanes(
  root,
  root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes,
);

然后根據 nextLanes 計算出本批次集合中優先級最高的 Lane,作為本地任務的優先級。

// We use the highest priority lane to represent the priority of the callback.
const newCallbackPriority = getHighestPriorityLane(nextLanes);

后續的邏輯就是取出當前已存在的調度優先級,與 newCallbackPriority 進行對比,根據對比結果來執行不同的更新方法。當該值等于 SyncLane 時,表示為同步更新。

同步優先級例如點擊事件。

然后會判斷是否支持微任務更新,如果不支持最后會執行 scheduleCallback。

if (newCallbackPriority === SyncLane) {
  if (supportsMicrotasks) {
    // Flush the queue in a microtask.
    if (__DEV__ && ReactCurrentActQueue.current !== null) {
      // Inside `act`, use our internal `act` queue so that these get flushed
      // at the end of the current scope even when using the sync version
      // of `act`.
      ReactCurrentActQueue.current.push(flushSyncCallbacks);
    } else {
      scheduleMicrotask(() => {
        // In Safari, appending an iframe forces microtasks to run.
        // https://github.com/facebook/react/issues/22459
        // We don't support running callbacks in the middle of render
        // or commit so we need to check against that.
        if (
          (executionContext & (RenderContext | CommitContext)) ===
          NoContext
        ) {
          // Note that this would still prematurely flush the callbacks
          // if this happens outside render or commit phase (e.g. in an event).
          flushSyncCallbacks();
        }
      });
    }
  } else {
    // Flush the queue in an Immediate task.
    scheduleCallback(ImmediateSchedulerPriority, flushSyncCallbacks);
  }
}

scheduleSyncCallback 的邏輯,也就是同步任務的調度非常簡單,就是將執行同步任務的回調添加到一個同步隊列 syncQueue 中。

export function scheduleSyncCallback(callback: SchedulerCallback) {
  // Push this callback into an internal queue. We'll flush these either in
  // the next tick, or earlier if something calls `flushSyncCallbackQueue`.
  if (syncQueue === null) {
    syncQueue = [callback];
  } else {
    // Push onto existing queue. Don't need to schedule a callback because
    // we already scheduled one when we created the queue.
    syncQueue.push(callback);
  }
}

這里的 callback 是之前傳入的 performSyncWorkOnRoot,這是用來執行同步更新任務的方法。他的邏輯主要包括:

  • 調用 renderRootSync,該方法會執行 workLoopSync,最后生成 Fiber true。
  • 將創建完成的 Fiber tree 掛載到 root 節點上。
  • 最后調用 commitRoot,進入 commit 階段修改真實 DOM。
function performSyncWorkOnRoot(root) {
  ...
  let exitStatus = renderRootSync(root, lanes);
  
  ...
  root.finishedWork = finishedWork;
  root.finishedLanes = lanes;
  commitRoot(
    root,
    workInProgressRootRecoverableErrors,
    workInProgressTransitions,
  );

  ensureRootIsScheduled(root, now());

  return null;
}

workLoopSync 的邏輯也非常簡單,如下:

function workLoopSync() {
  // Already timed out, so perform work without checking if we need to yield.
  while (workInProgress !== null) {
    performUnitOfWork(workInProgress);
  }
}

在 performUnitOfWork 中,會調用 beginWork 方法開始創建 Fiber 節點。

var next = beginWork(
  current, 
  unitOfWork, 
  subtreeRenderLanes
);

總結

同步更新的過程比較簡單,從 scheduleUpdateOnFiber 到 beginWork 這中間的流程里,大多數邏輯都在進行各種不同情況的判斷,因此源碼看上去比較吃力,實際邏輯并不是很重要,簡單了解即可,重要的是 beginWork 創建 Fiber 節點的方法,這跟我們之前文章里提到過的優化策略是一致的。

責任編輯:姜華 來源: 這波能反殺
相關推薦

2017-04-12 11:15:52

ReactsetState策略

2023-11-28 09:44:10

2023-11-01 09:00:14

存儲Docker服務器

2023-04-07 08:02:54

源碼位邏輯運算符

2020-05-20 14:25:45

Reactreact.js前端

2021-01-01 09:04:44

Linux內核變量

2025-01-20 09:15:00

iOS 18.3蘋果iOS 18

2019-06-26 19:18:05

Windows 10系統更新微軟

2023-05-17 19:30:52

企業

2024-01-24 09:14:27

編程范式數據

2015-03-10 10:15:27

AppleWatch開發Swift

2024-02-19 14:58:34

編程范式開發

2024-02-21 14:06:00

Linux文件系統

2019-11-24 19:17:06

MySQL異步復制全同步復制

2021-10-11 09:41:20

React位運算技巧前端

2021-04-26 09:22:07

ASP.NET Cor服務周期

2024-07-16 14:52:31

擴展系統負載均衡器

2019-03-18 15:00:48

SQLJoin用法數據庫

2020-10-21 08:38:47

React源碼

2024-05-07 08:49:45

微服務架構模式
點贊
收藏

51CTO技術棧公眾號

性欧美大战久久久久久久免费观看 | 欧美精品成人| 五月天激情小说综合| 91网站在线观看免费| 亚洲精品国产一区| 日韩欧美一区二| 天天射成人网| 亚洲深夜福利在线| 69久久久久| 一区二区在线观看免费视频播放| 999一区二区三区| 国产一区二区三区的电影| 免费在线视频一级不卡| av免费网站观看| 久久久精品性| 蜜臀精品一区二区| 91小视频xxxx网站在线| 黄色91在线观看| 欧美一区二区三| 校花撩起jk露出白色内裤国产精品| 国产综合色视频| 国产大尺度在线观看| 欧美日韩另类视频| 日本a在线天堂| av福利在线导航| 国产精品久久久久aaaa| 国产精品亚洲美女av网站| a级毛片免费观看在线| 麻豆精品视频在线观看| 欧美激情一区二区三级高清视频| 最近中文字幕mv第三季歌词| 裸体一区二区三区| 99精彩视频| 精品九九在线| 欧美理论电影在线观看| 制服丝袜专区在线| 亚洲成av人乱码色午夜| av资源网站在线观看| 亚洲一区二区三区免费视频| 日韩国产小视频| 国产精品久久久久久久免费软件| 日韩欧美aaa| 久久99热只有频精品91密拍| 女人抽搐喷水高潮国产精品| 99麻豆久久久国产精品免费优播| 国产在线一区二区三区四区| 亚洲另类春色校园小说| 中文字幕在线成人| 日韩精品丝袜美腿| 91久久久在线| 中文字幕一区二区在线播放| 性感女国产在线| 欧美凹凸一区二区三区视频 | 5566成人精品视频免费| 国产精品日韩成人| 国产女大学生av| 激情欧美一区二区三区黑长吊| 色悠久久久久综合欧美99| 激情亚洲色图| 午夜久久福利影院| 精品精品导航| ·天天天天操| 日韩高清dvd| 精品国产一区二区三区四区在线观看 | 中文字幕欧美亚洲| 欧美黑人又粗又大又爽免费| 欧美高清视频一二三区 | 国产精品99久久久久久大便| 不卡影院免费观看| 亚洲 高清 成人 动漫| 久久精品视频在线免费观看| 免费的很黄很污的视频网站| 亚洲最新视频在线| 欧美影院视频| 国产freexxxx性播放麻豆 | 亚洲成人av动漫| 中文字幕日本精品| 国产精品久久久久影院| 老司机免费视频一区二区三区| 好了av在线| 久久艳片www.17c.com| 日本不卡在线视频| 国产精品国产亚洲精品看不卡| 亚洲国产aⅴ天堂久久| 欧美aa在线| 日韩av123| 日韩精品一二三| 欧美,日韩,国产在线| 午夜久久久影院| 9999在线精品视频| 视频一区国产精品| 亚洲永久免费视频| 日韩毛片一区| 精选一区二区三区四区五区| 久久久久一区二区三区四区| 成年人在线视频免费观看| 久久久久久91香蕉国产| 蜜臀久久99精品久久久久久9| 黄色污网站在线免费观看| 亚洲经典中文字幕| 高清视频一区二区三区| 亚洲主播在线| 日韩av播放器| 色婷婷av一区二区三区之一色屋| 国产精品25p| 国产日韩一区在线| 99久久久久免费精品国产| 在线观看的av| 日本精品一区二区三区在线播放视频| 日本不卡一区二区| 中文字幕在线免费专区| 中文字幕在线观看日韩| 最新成人av网站| 成人图片小说| 在线精品91av| 亚洲成人直播| 濑亚美莉一二区在线视频| 国内精久久久久久久久久人| 精品中文字幕一区二区| 91大神在线网站| 成人av.网址在线网站| 亚洲国产精品99久久久久久久久| 手机在线观看av| 国产精品一区二区在线观看| 国产精品视频观看| 香蕉大人久久国产成人av| 奇米777四色影视在线看| 亚洲高清不卡av| 午夜视频一区| 色鬼7777久久| 国产精品18久久久久久首页狼 | 91丨九色丨国产丨porny| 麻豆免费在线观看| 国产欧美韩日| 在线亚洲高清视频| 亚洲激情女人| 国产剧情在线观看| 国产精品永久入口久久久| 欧美视频一区在线观看| 亚洲国产影院| 日本一区二区三区dvd视频在线 | 麻豆精品国产| 无码精品a∨在线观看中文| 中文字幕在线日韩| 91视频在线看| 麻豆导航在线观看| 久久国产精品99久久久久久丝袜| 欧美日韩国产首页在线观看| 亚洲久久视频| 国产黄色在线免费观看| 亚洲精品成人久久久998| 亚洲精品国产精品乱码不99按摩 | 精品伦理精品一区| 销魂美女一区二区三区视频在线| av播放在线| 欧洲精品久久| 一区二区三区亚洲变态调教大结局| 国内精品国产成人国产三级粉色 | 精品一区二区三区日韩| 成人在线影视| 992tv成人免费观看| 久久五月情影视| 精品毛片免费观看| 麻豆tv免费在线观看| 欧美1区2区3| 午夜影院免费| 国产尤物99| 国产亚洲一区二区精品| 中文字幕日韩一区二区| 在线一区电影| 成年女人在线看片| 国产一区二区视频免费在线观看| 国产91网红主播在线观看| 亚洲免费小视频| 欧美老女人在线| 国产色婷婷国产综合在线理论片a| 激情视频国产| 五月婷婷亚洲| 欧美群妇大交群中文字幕| 亚洲一二三区在线| 欧美xxxx做受欧美护士| 国产精品一区二区三区99| 一区二区三区在线免费视频| 欧美天天综合色影久久精品| 91精品中文在线| 久久97超碰色| 国产91免费看片| 日本久久久久久久久久久| 中文字幕一区二区三区在线观看 | 日韩av片在线看| 久久久久久a亚洲欧洲aⅴ| 国产精品美女在线播放| 日韩小视频网址| 在线成人性视频| 国产69精品久久久久9999人| 国产精品久久久久9999爆乳| 久久亚洲国产精品日日av夜夜| 国产成人综合美国十次| 超碰免费在线公开| 亚洲欧美日韩国产成人精品影院|