Выбор ответа Junior Рендер и reconciliation обновлено

Двойной вызов в StrictMode

Вопрос

В режиме разработки с <StrictMode> console.log в теле компонента срабатывает дважды. Почему?

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

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

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

Коротко

Правильный ответ: React нарочно вызывает компонент дважды, ища нечистый рендер. StrictMode в dev вызывает функции компонентов (и инициализаторы, редьюсеры) дважды, чтобы побочные эффекты в рендере стали заметны.

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

  1. Это баг: компонент рендерится повторно из-за лишнего setState
  2. StrictMode включает конкурентный режим, а он рендерит дважды
  3. Так происходит и в продакшене, отключить двойной вызов нельзя
  4. React нарочно вызывает компонент дважды, ища нечистый рендерправильный ответ

Разбор

StrictMode в dev вызывает функции компонентов (и инициализаторы, редьюсеры) дважды, чтобы побочные эффекты в рендере стали заметны. В продакшен-сборке двойного вызова нет. Лишнего setState тут нет, и конкурентный рендер сам по себе ничего не дублирует.

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

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