Всегда обновляй state через prev!
prev — спасёшь себя завтраВ React мы часто пишем setCount(count + 1) и радуемся, пока не поймаем гонку. Несколько обновлений подряд, асинхронные эффекты, батчинг в React 18 — и старое значение внезапно затирает новое. Привычка писать setState(prev => prev + 1) решает больше проблем, чем кажется.
setState(prev => …)setState подряд получают актуальную базу, даже в одном обработчике.prev всегда укажет на последнее значение, а не на замороженную копию.fetch или await не затирают состояние, которое уже изменилось другим событием.useTransition / useDeferredValue. prev хранит правду, даже когда компоненты рендерятся позже.prev помогает строить историю без пропусков.prev, проще писать иммутабельный код и избежать мутаций.prev в привычкуsetValue(value + 1) на setValue(prev => prev + 1) в езде. Даже если кажется, что гонки не будет.setFilters(prev => ({ ...prev, page: prev.page + 1 })) — и никаких мутаций.eslint-plugin-react-hooks/exhaustive-deps и собственное правило, которое ругается на обновление без prev.setState несколько раз подряд, чтобы убедиться: значение растёт.prevconst [likes, setLikes] = useState(0);
const handleLike = () => {
setLikes(prev => prev + 1);
sendAnalyticsEvent('like_clicked');
};Если заменить на setLikes(likes + 1), быстрые клики или deferred-render легко «съедят» пару инкрементов. Колбэк же аккуратно складывает каждое действие.
Callback-форма обновления состояния — страховка от тишком ползущих багов. Потратьте пару минут на рефакторинг сегодня, и завтра спасибо скажут и метрики, и QA, и вы, когда будете разбирать, почему «счётчик снова сломался». Сделайте prev привычным жестом — и React-компоненты станут надёжнее. 💪