Так, є, оскільки 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зміні візуалізації або через те, що деякий Prop перейшов до 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
}
....