Планировщик React `unstable_runWithPriority` никак не использует `priority`

#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:

Давайте воспользуемся вашей демонстрацией для иллюстрации.

  1. onClick => currentPriorityLevel = UserBlockingPriority
  2. setCounter(обработчик событий в runWithPriority) => createUpdate(eventTime, lane, suspenseConfig)
  3. дорожка поступает из requestUpdateLane(fiber, suspenseConfig)
  4. таким образом, линия исходит из 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;
    }