> Синхронная или асинхронная функция setState в React и почему (React, TypeScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Сбер
Стек: React, TypeScript
> Пример ответа
Метод setState в React работает синхронно внутри обработчиков событий React и асинхронно в остальных случаях (например, в setTimeout, нативных DOM-событиях, промисах). Это связано с механизмом пакетной обработки (batching) обновлений.
Внутри компонентов React (например, в useEffect или обработчиках, переданных в JSX) вызовы setState группируются и применяются за один рендер. Это сделано для оптимизации производительности: React избегает лишних перерисовок, объединяя несколько вызовов в один. Например:
TSXconst [count, setCount] = useState(0);const handleClick = () => {setCount(prev => prev + 1);setCount(prev => prev + 1);console.log(count); // 0 (асинхронно)};// После рендера count станет 2, а не 1
В setTimeout или нативных событиях пакетная обработка отключается, и setState работает синхронно:
TSXsetTimeout(() => {setCount(prev => prev + 1);console.log(count); // Уже обновлённое значение (синхронно)}, 0);
В React 18 с автоматическим batching (createRoot) все вызовы setState стали асинхронными, включая setTimeout и промисы, что упрощает поведение. Однако в legacy-режиме (ReactDOM.render) поведение остаётся прежним.
Итог: setState - асинхронный в контексте React (для оптимизации), но может быть синхронным вне его. Для получения актуального состояния используйте функциональную форму setState(prev => ...) или useEffect.
> Похожие задачи по frontend
Какая проблема при вызове fetch напрямую в компоненте Next.js
Как можно закэшировать данные useSWR, чтобы при возврате на страницу данные брались из кэша
Каков порядок вывода в консоль в React-компоненте?
Каковы преимущества Material UI
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью