Вопрос проверяет понимание механизма обнаружения изменений в React и того, почему мутации объектов и массивов не вызывают ре-рендер.
В React состояние должно быть неизменяемым (immutable). Когда вы используете хук useState, React хранит ссылку на объект состояния. При вызове функции обновления (например, setState) React сравнивает новое значение с предыдущим с помощью Object.is (аналог ===). Если ссылка не изменилась, React считает, что состояние осталось прежним, и пропускает ре-рендер.
const [items, setItems] = useState([1, 2, 3]);
// Неправильно: мутация
items.push(4);
setItems(items); // React не видит изменений, ре-рендера не будет
// Правильно: создание нового массива
setItems([...items, 4]); // Новая ссылка, ре-рендер произойдетReact использует алгоритм согласования (reconciliation). Когда вызывается setState, React помечает компонент как требующий обновления. Затем во время рендера он сравнивает предыдущее виртуальное DOM-дерево с новым. Если состояние не изменилось (по ссылке), React пропускает рендер компонента и его дочерних элементов, что повышает производительность.
Всегда создавайте новые объекты и массивы при обновлении состояния в React. Используйте спред-оператор, map, filter или библиотеки вроде Immer для удобной работы с иммутабельностью. Это гарантирует корректное обнаружение изменений и предсказуемое поведение интерфейса.
Уровень
Рейтинг:
5
Сложность:
3
Навыки
JavaScript
React
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию