#reactjs #scheduler #react-fiber
#reactjs #планировщик #реагировать-волокно
Вопрос:
Я запустил профилировщик для следующего кода:
function App() {
const [ counter, setCounter ] = useState(0);
return <div>
<div>{counter}</div>
<button onClick={(e) => setCounter(counter 1)}>Inc</button>
</div>
}
Что довольно стандартно, что интересно, так это unstable_runWithPriority
функция.
Он принимает приоритет в качестве параметра, но ничего не планирует, вместо этого он вызывает обработчик событий.
Независимо от того, какой приоритет, он все равно его запускает. Может кто-нибудь уточнить необходимость этой функции?
Разве не должна быть какая-то задача или микрозадача, запланированные на основе приоритета?
Ответ №1:
Он устанавливает currentPriorityLevel
(глобальную переменную, которая используется другими функциями в цепочке) заданный приоритет. Запускает задачу и currentPriorityLevel
возвращает ее исходное значение.
Комментарии:
1. Не могли бы вы указать это в коде? Я не думаю, что я это видел.
Ответ №2:
Давайте воспользуемся вашей демонстрацией для иллюстрации.
- onClick => currentPriorityLevel = UserBlockingPriority
- setCounter(обработчик событий в runWithPriority) =>
createUpdate(eventTime, lane, suspenseConfig)
- дорожка поступает из
requestUpdateLane(fiber, suspenseConfig)
- таким образом, линия исходит из currentPriorityLevel;
function requestUpdateLane(
fiber: Fiber,
suspenseConfig: SuspenseConfig | null,
): Lane {
const schedulerPriority = getCurrentPriorityLevel();
let lane;
if (
(executionContext amp; DiscreteEventContext) !== NoContext amp;amp;
schedulerPriority === UserBlockingSchedulerPriority
) {
lane = findUpdateLane(InputDiscreteLanePriority, currentEventWipLanes);
} else {
const schedulerLanePriority = schedulerPriorityToLanePriority(
schedulerPriority,
);
lane = findUpdateLane(schedulerLanePriority, currentEventWipLanes);
}
return lane;
}