React·100 питань

Як оновлювати об'єкти та масиви в state без мутацій?

Відповідь

Головне правило роботи зі state у бібліотеці React полягає в категоричній забороні на прямі мутації поточних даних. Якщо ви зміните властивість об'єкта чи елемент масиву «на місці», React просто не помітить цих змін, оскільки посилання на об'єкт у пам'яті залишиться колишнім, а отже, компонент не виконає повторний рендеринг і інтерфейс користувача залишиться старим.

Щоб оновлювати складні структури даних коректно та без побічних ефектів, необхідно завжди створювати їх нові копії. Для роботи з об'єктами використовується синтаксис оператора розширення, який дозволяє скопіювати старі властивості та перезаписати лише потрібні поля, наприклад через конструкцію setS(prev => ({ ...prev, a: 1 })).

Для додавання нових елементів до масивів також застосовується оператор spread, який розгортає старий масив у новий із додаванням елемента: setA(prev => [...prev, item]). Якщо ж вам потрібно видалити елемент із масиву без мутації вихідного списку, слід використовувати метод filter, який повертає абсолютно новий масив, що містить лише ті елементи, які задовольняють задану умову.

У тих випадках, коли структура стану стає занадто глибокою та вкладеною, ручне копіювання через оператори розширення може сильно захаращувати код. Для спрощення роботи з такими даними розробники часто підключають спеціалізовані бібліотеки, такі як Immer, яка дозволяє писати код так, ніби ви мутуєте дані безпосередньо, але під капотом створює безпечні незмінні копії.

Чи корисна ця відповідь?

Інші питання цієї теми

Пов’язані питання з інших тем