React может объединить несколько вызовов setState() в одно обновление для оптимизации производительности. Это асинхронное поведение создаёт серьёзную проблему: this.props и this.state могут не отражать актуальные значения в момент выполнения setState().
Когда используешь объект, рискуешь вычислить следующее состояние на основе устаревших значений:
// ❌ Неправильный подход
this.setState({ counter: this.state.counter + this.props.increment })
Если несколько вызовов setState() объединяются вместе, this.state.counter может ещё не обновиться, и счётчик увеличится неправильно.
Рекомендуемый подход — передать функцию в setState() вместо объекта. Эта функция получает два аргумента:
// ✅ Правильный подход
this.setState((prevState, props) => ({
counter: prevState.counter + props.increment
}))
Использование функциональной формы гарантирует, что вычисления состояния основаны на точных, актуальных значениях, а не на потенциально устаревших ссылках.
Батчинг нескольких вызовов setState() в React означает, что this.state может содержать устаревшие значения при выполнении объектной формы setState(), поэтому функциональная форма предпочтительнее для надёжных расчётов состояния.
Новый — ещё не проверен сообществом
Вы