Выбор ответа Junior Код-ревью обновлено
Мутация состояния
Вопрос
Почему после клика новый элемент не появляется на экране?
const [items, setItems] = useState<string[]>([]);
const add = (item: string) => {
items.push(item);
setItems(items);
};
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: push мутирует массив, ссылка та же, и React не видит изменения. React сравнивает новое состояние со старым через Object.is.
Варианты ответа
pushмутирует массив, ссылка та же, и React не видит измененияправильный ответ- Нужно вызвать
setItemsдважды, первый вызов React пропускает useStateне работает с массивами, нуженuseReducer- Не хватает
useEffect, который следит заitemsи вызывает рендер
Разбор
React сравнивает новое состояние со старым через Object.is. Тот же массив после push равен самому себе, поэтому рендер пропускается. Правильно setItems(prev => [...prev, item]). Двойной вызов передаст ту же ссылку. Массивы в useState работают, если их не мутировать. Эффект ничего не исправит.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.