Так, є, оскільки 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
}
....