Tak, ponieważ setState
działa w pewien asynchronous
sposób. Oznacza to, że po wywołaniu setState
do this.state
zmiennej nie jest natychmiast zmienić. więc jeśli chcesz wykonać akcję natychmiast po ustawieniu stanu na zmienną stanu, a następnie zwrócić wynik, przydatne będzie wywołanie zwrotne
Rozważ poniższy przykład
....
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" });
}
},
....
Powyższy kod może nie działać zgodnie z oczekiwaniami, ponieważ title
zmienna mogła nie zostać zmutowana przed wykonaniem na niej sprawdzania poprawności. Teraz możesz się zastanawiać, czy możemy przeprowadzić walidację w render()
samej funkcji, ale byłby lepszy i czystszy sposób, gdybyśmy mogli sobie z tym poradzić w samej funkcji changeTitle, ponieważ dzięki temu twój kod byłby bardziej zorganizowany i zrozumiały.
W takim przypadku przydatne jest oddzwonienie
....
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" });
}
},
....
Innym przykładem będzie sytuacja, gdy chcesz dispatch
i działanie, gdy stan się zmieni. będziesz chciał to zrobić w trybie oddzwaniania, a nie w taki render()
sposób, w jaki będzie on wywoływany za każdym razem, gdy nastąpi ponowne wyrenderowanie, a zatem istnieje wiele takich scenariuszy, w których będziesz potrzebował oddzwonienia.
Innym przypadkiem jest API Call
Może się zdarzyć, że konieczne będzie wywołanie interfejsu API na podstawie konkretnej zmiany stanu, jeśli zrobisz to w metodzie renderowania, będzie ona wywoływana przy każdej onState
zmianie renderowania lub dlatego, że niektóre Prop przeszły na Child Component
zmienioną.
W takim przypadku należy użyć a, setState callback
aby przekazać zaktualizowaną wartość stanu do wywołania API
....
changeTitle: function (event) {
this.setState({ title: event.target.value }, () => this.APICallFunction());
},
APICallFunction: function () {
// Call API with the updated value
}
....