setState
является асинхронным, поэтому состояние не обновляется немедленно. Вы можете передать обратный вызов в качестве второго аргумента setState
, который будет вызываться только при обновлении состояния:
this.setState(
{ currentPlayer: nextPlayer },
() => console.log(`userDidMove changed state with ${this.state.currentPlayer}`)
);
setState
(React Docs):
setState(updater[, callback])
ИЛИ setState(stateChange[, callback])
Думайте о setState () как о запросе, а не как о немедленной команде
обновить компонент. Для лучшего восприятия производительности React может
задержать его, а затем обновить несколько компонентов за один проход. реагировать
не гарантирует, что изменения состояния будут применены немедленно.
setState () не всегда сразу обновляет компонент. Это может
Пакет или отложить обновление до позже. Это делает чтение this.state
сразу после вызова setState () потенциальная ловушка. Вместо этого используйте
componentDidUpdate или обратный вызов setState (setState (Updater,
callback)), любой из которых гарантированно сработает после обновления
был применен. Если вам нужно установить состояние на основе предыдущего
состояние, прочитайте об аргументе обновления ниже.
ПРИМЕЧАНИЕ. Я предлагаю наблюдать за состоянием, используя React Dev Tools вместо его регистрации.
ОБНОВЛЕНИЕ : В этом ответе изначально неверно указывалось, что setState
вернул обещание и предложил, чтобы вы могли связать .then()
, который будет вызываться после обновления состояния. С тех пор я исправил ответ, вдохновленный @ Sushanth 's answer .