从当前 fiberNode 向上遍历,获取第一个类型为 HostComponent、HostRoot、HostPortal 三者之一的祖先 fiberNode,其对应的 DOM 元素是“执行 DOM 操作的目标元素的父级 DOM 元素” var parentFiber = getHostParentFiber(finishedWork)
获取用于执行 parentNode.insertBefore(child, before) 方法的 “before 对应 DOM 元素” var before = getHostSibling(finishedWork)
执行 parentNode.insertBefore 方法(存在 before 的情况)或 parentNode.appendChild 方法(不存在 before 的情况)
Update flag 对应 commitWork 方法
对于 FC 等类型的 fiberNode,会执行 commitHookEffectListUnmount 和 commitHookEffectListMount 方法
var schedulerPriorityLevel
switch (lanesToEventPriority(nextLanes)) {
case DiscreteEventPriority:
schedulerPriorityLevel = ImmediatePriority
break
case ContinuousEventPriority:
schedulerPriorityLevel = UserBlockingPriority
break
case DefaultEventPriority:
schedulerPriorityLevel = NormalPriority
break
case IdleEventPriority:
schedulerPriorityLevel = IdlePriority
break
default:
schedulerPriorityLevel = NormalPriority
break
}
function unstable_scheduleCallback(priorityLevel, callback, options) {
var currentTime = exports.unstable_now()
var startTime
if (typeof options === 'object' && options !== null) {
var delay = options.delay
if (typeof delay === 'number' && delay > 0) {
startTime = currentTime + delay
} else {
startTime = currentTime
}
} else {
startTime = currentTime
}
var timeout
switch (priorityLevel) {
case ImmediatePriority:
timeout = IMMEDIATE_PRIORITY_TIMEOUT
break
case UserBlockingPriority:
timeout = USER_BLOCKING_PRIORITY_TIMEOUT
break
case IdlePriority:
timeout = IDLE_PRIORITY_TIMEOUT
break
case LowPriority:
timeout = LOW_PRIORITY_TIMEOUT
break
case NormalPriority:
default:
timeout = NORMAL_PRIORITY_TIMEOUT
break
}
var expirationTime = startTime + timeout
var newTask = {
id: taskIdCounter++,
callback: callback,
priorityLevel: priorityLevel,
startTime: startTime,
expirationTime: expirationTime,
sortIndex: -1,
}
if (startTime > currentTime) {
// This is a delayed task.
newTask.sortIndex = startTime
push(timerQueue, newTask)
if (peek(taskQueue) === null && newTask === peek(timerQueue)) {
// All tasks are delayed, and this is the task with the earliest delay.
if (isHostTimeoutScheduled) {
// Cancel an existing timeout.
cancelHostTimeout()
} else {
isHostTimeoutScheduled = true
} // Schedule a timeout.
requestHostTimeout(handleTimeout, startTime - currentTime)
}
} else {
newTask.sortIndex = expirationTime
push(taskQueue, newTask)
// wait until the next time we yield.
if (!isHostCallbackScheduled && !isPerformingWork) {
isHostCallbackScheduled = true
requestHostCallback(flushWork)
}
}
return newTask
}
var channel = new MessageChannel()
var port = channel.port2
channel.port1.onmessage = performWorkUntilDeadline
schedulePerformWorkUntilDeadline = function () {
port.postMessage(null)
}
function workLoopSync() {
while (workInProgress !== null) {
performUnitOfWork(workInProgress)
}
}
function workLoopConcurrent() {
while (workInProgress !== null && !shouldYield()) {
performUnitOfWork(workInProgress)
}
}