Да, так как setStateработает таким asynchronousобразом. Это означает , что после вызова setStateв this.stateпеременной не сразу изменилось. так что если вы хотите выполнить действие сразу после установки состояния для переменной состояния, а затем вернуть результат, обратный вызов будет полезен
Рассмотрим пример ниже
....
changeTitle: function changeTitle (event) {
this.setState({ title: event.target.value });
this.validateTitle();
},
validateTitle: function validateTitle () {
if (this.state.title.length === 0) {
this.setState({ titleError: "Title can't be blank" });
}
},
....
Приведенный выше код может работать не так, как ожидалось, поскольку titleпеременная может не мутировать до того, как будет выполнена проверка. Теперь вы можете задаться вопросом, что мы можем выполнить проверку в самой render()функции, но было бы лучше и чище, если бы мы могли обрабатывать это в самой функции changeTitle, поскольку это сделало бы ваш код более организованным и понятным
В этом случае обратный вызов полезен
....
changeTitle: function changeTitle (event) {
this.setState({ title: event.target.value }, function() {
this.validateTitle();
});
},
validateTitle: function validateTitle () {
if (this.state.title.length === 0) {
this.setState({ titleError: "Title can't be blank" });
}
},
....
Другим примером будет, когда вы хотите, dispatchи действия, когда состояние изменилось. вы захотите сделать это в render()обратном вызове, а не в том, как он будет вызываться при каждом повторном рендеринге, и, следовательно, возможны многие такие сценарии, когда вам потребуется обратный вызов.
Еще один случай API Call
Может возникнуть ситуация, когда вам нужно сделать вызов API на основе определенного изменения состояния, если вы сделаете это в методе рендеринга, он будет вызываться при каждом onStateизменении рендеринга или потому, что какой-то пропущенный элемент передается Child Componentизмененному.
В этом случае вы захотите использовать a setState callbackдля передачи обновленного значения состояния в вызов API
....
changeTitle: function (event) {
this.setState({ title: event.target.value }, () => this.APICallFunction());
},
APICallFunction: function () {
// Call API with the updated value
}
....