Выбор ответа Junior Код-ревью обновлено

Мутация состояния

Вопрос

Почему после клика новый элемент не появляется на экране?

const [items, setItems] = useState<string[]>([]);
const add = (item: string) => {
  items.push(item);
  setItems(items);
};

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

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

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

Коротко

Правильный ответ: push мутирует массив, ссылка та же, и React не видит изменения. React сравнивает новое состояние со старым через Object.is.

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

  1. push мутирует массив, ссылка та же, и React не видит измененияправильный ответ
  2. Нужно вызвать setItems дважды, первый вызов React пропускает
  3. useState не работает с массивами, нужен useReducer
  4. Не хватает useEffect, который следит за items и вызывает рендер

Разбор

React сравнивает новое состояние со старым через Object.is. Тот же массив после push равен самому себе, поэтому рендер пропускается. Правильно setItems(prev => [...prev, item]). Двойной вызов передаст ту же ссылку. Массивы в useState работают, если их не мутировать. Эффект ничего не исправит.

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

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