React·100 питань

Чому setState в циклі/кілька разів поспіль може поводитися несподівано?

Відповідь

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

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

Для запобігання подібним помилкам і коректної роботи з послідовними змінами рекомендується дотримуватися кількох важливих правил.

Використовуйте функціональні оновлення стану, передаючи в setState callback-функцію замість прямого значення.
Для об'єднання кількох послідовних змін в один логічний крок виконуйте обчислення заздалегідь або збирайте дані в проміжну змінну.
У складних сценаріях із великою кількістю взаємопов'язаних переходів краще використовувати хук useReducer замість безлічі розрізнених setState.

Застосування цих підходів гарантує передбачувану поведінку коду, виключає баги з втратою даних і робить архітектуру компонентів надійнішою та легшою в підтриманні.

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

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

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