Почему в обработчике старый state?

В React, когда вы обновляете состояние компонента с помощью функции setState, новое состояние не будет мгновенно доступно в следующей строке кода после вызова setState. Вместо этого React планирует обновление состояния и выполняет его асинхронно.

Это делается для оптимизации производительности, поскольку React может объединять несколько обновлений состояния в одно, чтобы минимизировать количество операций перерисовки компонента.

Когда обновление состояния планируется React, он помещает новое состояние в очередь и продолжает выполнение кода дальше. В этот момент предыдущее состояние компонента остается неизменным. Таким образом, если ваши обработчики событий или другие функции, вызываемые после setState, пытаются получить доступ к состоянию, они могут получить только предыдущее состояние, потому что React еще не обновил его.

Если вы хотите использовать новое состояние сразу после вызова setState, у вас есть несколько вариантов решения:

1. Вы можете использовать функцию обратного вызова вторым аргументом для setState, которая будет вызвана после обновления состояния:

this.setState({ count: this.state.count + 1 }, () => {
  console.log(this.state.count); // Новое состояние
});

2. Вы можете использовать методы жизненного цикла React, такие как componentDidUpdate, который вызывается после обновления компонента:

componentDidUpdate(prevProps, prevState) {
  console.log(this.state.count); // Новое состояние
}

3. Вы можете использовать метод setState с функцией вместо объекта, в которой будет доступно предыдущее состояние:

this.setState(prevState => ({
  count: prevState.count + 1
}));

Использование одного из этих методов позволит вам получить доступ к новому состоянию после вызова setState.