Під час оновлення React порівнює новий список елементів зі старим. key каже, який елемент нового списку відповідає якому елементу старого - щоб зберегти його стан і DOM.
<ul>
{todos.map((todo) => (
<TodoItem key={todo.id} todo={todo} />
))}
</ul>
Без key React виводить попередження й зіставляє елементи за позицією.
З індексом як key - те саме зіставлення за позицією, лише без попередження. Поки список лише дописують у кінець, проблем немає. Після видалення, вставки на початок чи сортування:
- стан компонентів (введений текст у полі, чекбокс, розгорнутість) «переїжджає» до сусіднього елемента;
- React оновлює вміст багатьох елементів замість переміщення одного.
Правила для key:
- Стабільний: той самий для того самого елемента між рендерами -
idз бази. - Унікальний серед сусідів (не глобально).
- Не генерувати під час рендеру:
key={Math.random()}чиcrypto.randomUUID()змушують React щоразу перестворювати всі елементи й губити стан. Якщо в даних немає ID, його генерують один раз - при створенні запису.
Корисний прийом: зміна key компонента примусово перестворює його з чистим станом: <Profile key={userId} userId={userId} /> - форма скинеться при переході до іншого користувача.