PassFront
  1. PassFront
  2. База знаний
  3. Компоненты

Зачем нужен key при создании списка данных в JSX?

Компоненты

key при рендере списка нужен, чтобы React мог опознавать элементы между рендерами — понимать, что добавилось, что удалилось, а что просто переместилось.

Что происходит без key

Список в JSX — массив элементов. Без ключей при сравнении деревьев React сопоставляет их по позиции:

// было: [<Item A/>, <Item B/>, <Item C/>]
// вставили X в начало: [<Item X/>, <Item A/>, <Item B/>, <Item C/>]
// React по позициям: «A стал X, B стал A, C стал B, добавился C»

Итог: обновлены все элементы (вместо одной вставки), а состояние элементов (ввод, фокус, чекбоксы) остаётся на позициях и «переезжает» к чужим данным.

Что даёт key

{messages.map((m) => (
  <Message key={m.id} data={m} />
))}

React сопоставляет по ключу: id=5 остался id=5 (узел и state переиспользуются), появился новый id=9 (создать), исчез id=2 (удалить). Минимум DOM-операций, состояние всегда у своих данных.

Требования

  • Стабильный: тот же элемент данных — тот же key между рендерами. Не Math.random(), не индекс в изменяемом списке (индексы «переезжают» при вставках/сортировке).
  • Уникальный среди соседей (не глобально).
  • Обычно — id из данных; индекс допустим только для статичного списка без состояния.

Дополнительно

key не виден компоненту в props; смена key — приём принудительного пересоздания компонента (сброс формы: <Form key={userId} />); при map по фрагментам — <React.Fragment key={...}>.

Коротко для собеседования

key даёт React идентичность элементов списка при диффе: переиспользование DOM и state, корректные вставки/удаления/перестановки вместо массового обновления «по позициям». Ключ — стабильный уникальный id из данных; индекс — только для статичных списков.

Другие вопросы раздела