日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-05-11 09:21:16 341觀看
導讀在 React 源碼中,scheduleUpdateOnFiber 是所有任務的唯一入口方法。我們前面分析 useState 的實現原理章節中,我們可以清晰的知道,當我們調用 dispatchSetState 時,最終會調用該入口方法。scheduleUpdateOnFiber 主要用

wS628資訊網——每日最新資訊28at.com

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

wS628資訊網——每日最新資訊28at.com

scheduleUpdateOnFiber 主要用于觸發一個 Fiber 節點上的調度更新任務,該函數里主要有兩個核心邏輯。wS628資訊網——每日最新資訊28at.com

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

markRootUpdated 的邏輯如下,簡單了解一下即可。wS628資訊網——每日最新資訊28at.com

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。wS628資訊網——每日最新資訊28at.com

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

然后根據 nextLanes 計算出本批次集合中優先級最高的 Lane,作為本地任務的優先級。wS628資訊網——每日最新資訊28at.com

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

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

同步優先級例如點擊事件。wS628資訊網——每日最新資訊28at.com

然后會判斷是否支持微任務更新,如果不支持最后會執行 scheduleCallback。wS628資訊網——每日最新資訊28at.com

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 中。wS628資訊網——每日最新資訊28at.com

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,這是用來執行同步更新任務的方法。他的邏輯主要包括:wS628資訊網——每日最新資訊28at.com

  • 調用 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 的邏輯也非常簡單,如下:wS628資訊網——每日最新資訊28at.com

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

在 performUnitOfWork 中,會調用 beginWork 方法開始創建 Fiber 節點。wS628資訊網——每日最新資訊28at.com

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

總結

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

本文鏈接:http://m.www897cc.com/showinfo-26-87990-0.html一圖看懂 React 源碼中的同步更新邏輯

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一篇學會Go中reflect反射的詳細用法

下一篇: SpringBoot3使用虛擬線程一定要小心了

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品日本一区二区| 久久久久国产成人精品亚洲午夜| 亚洲激情偷拍| 亚洲精品久久久蜜桃 | 亚洲高清自拍| 亚洲电影观看| 亚洲视频1区2区| 久久国产精品一区二区| 另类专区欧美制服同性| 欧美日韩精品一区视频| 国产精品国产三级国产普通话99| 国产亚洲永久域名| 亚洲欧洲久久| 午夜精品在线视频| 欧美成人性网| 国产免费亚洲高清| 亚洲国产婷婷综合在线精品 | 99精品久久久| 久久成人亚洲| 欧美日本韩国在线| 国产三区精品| 日韩午夜剧场| 久久国内精品自在自线400部| 欧美激情综合五月色丁香| 国产精品亚洲精品| 91久久精品www人人做人人爽| 亚洲一区在线免费观看| 看欧美日韩国产| 国产精品久久久久国产精品日日| 在线电影国产精品| 亚洲女性喷水在线观看一区| 欧美xxx在线观看| 国产目拍亚洲精品99久久精品 | 亚洲午夜国产成人av电影男同| 久久一区二区三区超碰国产精品| 欧美视频在线看| 亚洲国产精品999| 午夜在线不卡| 欧美日韩高清免费| 狠狠色丁香婷综合久久| 亚洲无毛电影| 欧美国产极速在线| 韩国自拍一区| 香蕉尹人综合在线观看| 欧美日韩午夜| 91久久国产自产拍夜夜嗨| 久久爱www| 国产精品视频xxx| 一本一本久久a久久精品牛牛影视| 另类av一区二区| 国产午夜精品一区二区三区欧美| 制服丝袜亚洲播放| 欧美激情麻豆| 在线观看亚洲| 久久久国际精品| 国产精品亚洲美女av网站| 一区二区三区免费网站| 欧美激情亚洲国产| 亚洲国产第一| 久久这里只精品最新地址| 国产亚洲激情视频在线| 亚洲欧美一区二区三区极速播放| 欧美日韩免费一区| 亚洲人成在线观看| 欧美aaaaaaaa牛牛影院| 在线观看视频免费一区二区三区| 久久黄色小说| 国内精品视频在线观看| 欧美综合77777色婷婷| 国产精品一区二区久久久久| 亚洲私人影吧| 国产精品盗摄久久久| 夜夜狂射影院欧美极品| 欧美日韩三级电影在线| 亚洲精品午夜| 欧美伦理视频网站| 99在线精品免费视频九九视| 欧美激情麻豆| 亚洲免费观看在线观看| 欧美日韩国产va另类| 日韩视频在线免费观看| 欧美激情亚洲激情| 亚洲美女中文字幕| 欧美日韩三区四区| 在线中文字幕不卡| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲午夜激情网页| 国产精品久久久久久妇女6080| 亚洲一区中文| 国产人成一区二区三区影院| 欧美在线免费观看亚洲| 激情综合中文娱乐网| 麻豆freexxxx性91精品| 亚洲欧洲日产国产网站| 欧美日韩国产综合网| 亚洲视频观看| 国产伦理一区| 久久久精品性| 亚洲国产欧美一区二区三区久久 | 欧美日韩国产在线观看| 亚洲婷婷在线| 国产日韩欧美一区二区三区在线观看 | 亚洲国产欧美国产综合一区 | 在线观看国产成人av片| 欧美成人r级一区二区三区| 亚洲美女性视频| 国产精品久久波多野结衣| 欧美亚洲在线播放| 在线观看日韩欧美| 欧美日本精品一区二区三区| 亚洲一区二区三区777| 国产视频在线观看一区二区| 久久在线免费观看| 99re视频这里只有精品| 国产精品一区免费视频| 久久婷婷av| 99国产精品99久久久久久| 国产精品夫妻自拍| 久久久久久久999| 亚洲免费观看高清在线观看| 国产精品激情| 久久久久国产免费免费| 亚洲激情亚洲| 国产精品久久久久aaaa| 久久精品一区二区三区不卡| 亚洲人精品午夜在线观看| 国产精品美女xx| 美女国内精品自产拍在线播放| 一区二区三区导航| 狠狠色综合网站久久久久久久| 欧美激情在线免费观看| 欧美一区二区精美| 亚洲激情在线视频| 国产伦精品一区二区三区免费| 免费成人黄色片| 亚洲免费影院| 亚洲国产日韩综合一区| 国产精品视频福利| 欧美大片国产精品| 亚洲欧美激情四射在线日| 在线免费日韩片| 国产精品激情av在线播放| 久久一区中文字幕| 亚洲欧美成人在线| 亚洲三级免费电影| 国产一区二区三区精品欧美日韩一区二区三区 | 国内成人精品视频| 欧美日韩一区自拍| 久久综合久久久久88| 制服丝袜激情欧洲亚洲| 在线观看一区二区视频| 国产精品入口66mio| 欧美精品激情blacked18| 久久激情综合| 亚洲综合国产精品| 亚洲精品国产品国语在线app| 国产日韩在线一区| 国产精品va在线播放我和闺蜜| 久久久噜噜噜久久人人看| 亚洲一区免费| 亚洲麻豆国产自偷在线| 在线播放国产一区中文字幕剧情欧美| 国产精品久久久久婷婷| 欧美日本一道本| 麻豆9191精品国产| 久久成人18免费网站| 99精品久久免费看蜜臀剧情介绍| 在线免费观看日本欧美| 国产主播一区二区三区四区| 国产精品欧美经典| 欧美日韩中文字幕综合视频| 欧美高清视频一区二区| 久久亚洲欧美| 欧美在线综合| 午夜伦理片一区| 亚洲影院在线观看| 这里只有精品视频在线| 99热精品在线| 日韩小视频在线观看| 亚洲激情成人网| 亚洲第一精品夜夜躁人人躁| 国产综合亚洲精品一区二| 国产日产精品一区二区三区四区的观看方式 | 在线看视频不卡| 国语自产精品视频在线看抢先版结局 | 国产精品乱子久久久久| 欧美日韩视频不卡| 欧美精品首页| 欧美激情亚洲另类| 欧美精品久久久久久久免费观看 | 国产亚洲人成a一在线v站| 国产美女搞久久| 国产精品一区二区在线| 国产精品亚洲综合色区韩国| 欧美午夜电影一区| 欧美香蕉大胸在线视频观看| 欧美午夜视频在线| 国产精品a级| 欧美体内谢she精2性欧美| 欧美另类久久久品| 欧美三级日韩三级国产三级| 欧美日韩视频专区在线播放| 欧美日韩国产精品自在自线| 欧美日韩日日骚|