> Как работает обновление состояния при нескольких вызовах setState в React? (React, TypeScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Альфа-банк
Стек: React, TypeScript
> Пример ответа
В React при нескольких вызовах setState в одном синхронном контексте (например, в обработчике события или в useEffect) обновления объединяются (batch). React группирует их в один рендер для оптимизации производительности.
Если передавать объект, как setState({ count: count + 1 }), то каждый вызов будет использовать одно и то же начальное состояние, поэтому setState({ count: count + 1 }) трижды даст прирост только на 1. Чтобы получить актуальное значение, нужно использовать функциональную форму: setState(prev => ({ count: prev.count + 1 })). Тогда каждый вызов получит предыдущее обновлённое состояние, и три вызова увеличат счётчик на 3.
В React 18 и выше батчинг работает и в асинхронных контекстах (например, в setTimeout, промисах). Если нужно принудительно обновить состояние немедленно, можно использовать flushSync из react-dom.
Пример на TypeScript:
TSXconst [count, setCount] = useState(0);// Объектная форма - только +1const handleObject = () => {setCount(count + 1);setCount(count + 1);setCount(count + 1); // Итог: count = 1};// Функциональная форма - +3const handleFunction = () => {setCount(prev => prev + 1);setCount(prev => prev + 1);setCount(prev => prev + 1); // Итог: count = 3};
> Похожие задачи по frontend
Почему при кликах на кнопку может происходить рассинхронизация цвета текста и фона в React
Как работает состояние счетчика при ререндере в React?
Нужно ли использовать useEffect для подписки на изменения неконтролируемого input с ref в React?
Можно ли реализовать логику без useEffect в React и как?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью