React·100 питань

Чому не можна викликати setState після unmount і як цього уникати?

Відповідь

Спроба змінити стан уже розмонтованого компонента є однією з класичних помилок розробки на React, яка часто призводить до появи настирливих попереджень у консолі розробника. Ця ситуація виникає тоді, коли користувач ініціює асинхронну операцію, наприклад мережевий запит або тривале обчислення, а потім миттєво переходить на іншу сторінку або закриває поточний модальний елемент. Коли фоновий процес завершується, код намагається викликати функцію оновлення стану для компонента, якого більше не існує в актуальному дереві елементів. Хоча сучасні версії бібліотеки навчилися справлятися з частиною таких викликів без критичних збоїв, ігнорування цієї проблеми веде до прихованих витоків пам'яті та зниження загальної стабільності програмного забезпечення.

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

Варто зазначити, що при використанні просунутих бібліотек для управління серверним станом і кешування даних багато з цих проблем вирішуються автоматично «з коробки». Такі інструменти самостійно вміють скасовувати застарілі запити і запобігають оновленню даних для неактивних сторінок. Однак при написанні кастомної логіки розробнику завжди слід самостійно закладати захисні механізми, що забезпечують безпечну роботу з асинхронним кодом.

Використовуйте функцію очищення в хукі ефекту для зміни локального прапора актуальності компонента під час його демонтажу.
Застосовуйте контролери скасування запитів для миттєвого припинення мережевої активності під час виходу зі сторінки.
Перевіряйте статус компонента перед викликом функції оновлення стану, якщо асинхронна операція не може бути скасована.
Чи корисна ця відповідь?

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

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