Выбор ответа Junior React 18-19: Suspense, transitions, RSC обновлено

Автоматический батчинг

Вопрос

Сколько рендеров вызовет этот код в React 18+ после ответа сервера?

fetch('/api/user').then(async (r) => {
  const user = await r.json();
  setUser(user);
  setLoading(false);
  setError(null);
});

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Один: обновления внутри промиса объединяются. С React 18 при createRoot автоматический батчинг работает везде: в промисах, таймерах, нативных обработчиках.

Варианты ответа

  1. Один: обновления внутри промиса объединяютсяправильный ответ
  2. Три: по одному на каждый setState в then
  3. Два: первый setState синхронный, остальные вместе
  4. Ноль: внутри then состояние менять нельзя

Разбор

С React 18 при createRoot автоматический батчинг работает везде: в промисах, таймерах, нативных обработчиках. Три вызова дадут один рендер. В React 17 вне обработчиков React было бы три рендера.

  • Три рендера были бы в React 17.
  • Особого статуса у первого вызова нет.
  • Менять состояние в then можно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.