Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: React, reconciliation, keys, component state, virtual DOM

Почему без явных ключей компоненты сохраняют состояние при переключении между разными массивами данных?

Проверяет понимание механизма согласования React и роли ключей при повторном использовании DOM-элементов.

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

React использует ключи для идентификации элементов в массиве. Если ключи не указаны, React использует индекс элемента. При переключении между разными массивами данных React может повторно использовать существующие DOM-узлы, если их индексы совпадают, что приводит к сохранению состояния компонентов. Это происходит из-за того, что React не пересоздает компонент, а обновляет его пропсы.

Длинный ответ

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

Когда вы рендерите список компонентов без указания явных ключей, React использует индекс элемента в массиве в качестве ключа по умолчанию. Это может привести к неожиданному поведению при переключении между разными массивами данных.

Механизм согласования (Reconciliation)

React сравнивает виртуальные DOM-деревья с помощью алгоритма сравнения. Если ключи элементов совпадают, React считает, что это один и тот же элемент, и обновляет только его пропсы, сохраняя состояние компонента.

Пример проблемы

function App() {
  const [items, setItems] = useState([{id: 1, text: 'A'}, {id: 2, text: 'B'}]);
  
  return (
    <div>
      {items.map((item, index) => (
        <InputComponent key={index} value={item.text} />
      ))}
      <button onClick={() => setItems([{id: 3, text: 'C'}, {id: 4, text: 'D'}])}>
        Сменить данные
      </button>
    </div>
  );
}

В этом примере при нажатии на кнопку React повторно использует существующие компоненты InputComponent, потому что их индексы (0 и 1) совпадают. Состояние внутри компонентов (например, введенный текст) сохранится, хотя данные полностью изменились.

Правильное решение

Всегда используйте уникальные и стабильные ключи, например, идентификаторы из базы данных:

{items.map(item => (
  <InputComponent key={item.id} value={item.text} />
))}

Вывод

Явные ключи необходимы для корректной работы React при рендеринге списков. Они помогают избежать ошибок с сохранением состояния и обеспечивают правильное обновление компонентов при изменении данных.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

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

#React

#reconciliation

#keys

#component state

#virtual DOM

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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