Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: React, state mutation, immutability, re-render, useState

Почему мутация массива через push не вызывает ре-рендер компонента в React?

Вопрос проверяет понимание механизма обнаружения изменений в React и того, почему мутации объектов и массивов не вызывают ре-рендер.

Короткий ответ

React использует поверхностное сравнение (shallow comparison) для определения изменений состояния. Когда вы вызываете setState, React сравнивает предыдущее и новое значение с помощью оператора строгого равенства (===). Мутация массива через push изменяет содержимое массива, но ссылка на массив остается той же. Поэтому 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 для удобной работы с иммутабельностью. Это гарантирует корректное обнаружение изменений и предсказуемое поведение интерфейса.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    5

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#React

#state mutation

#immutability

#re-render

#useState

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию