Có, vì setStatelàm việc theo một asynchronouscách. Đó là phương tiện sau khi gọi setStatecác this.statebiến không ngay lập tức thay đổi. vì vậy nếu bạn muốn thực hiện một hành động ngay sau khi đặt trạng thái trên một biến trạng thái và sau đó trả về một kết quả, một cuộc gọi lại sẽ hữu ích
Hãy xem xét ví dụ dưới đây
....
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" });
}
},
....
Đoạn mã trên có thể không hoạt động như mong đợi vì titlebiến có thể không bị đột biến trước khi xác thực được thực hiện trên nó. Bây giờ bạn có thể tự hỏi rằng chúng ta có thể thực hiện xác thực trong render()chính chức năng đó nhưng sẽ tốt hơn và tốt hơn nếu chúng ta có thể xử lý việc này trong chính hàm ChangeTitle vì điều đó sẽ giúp mã của bạn có tổ chức và dễ hiểu hơn
Trong trường hợp này gọi lại là hữu ích
....
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" });
}
},
....
Một ví dụ khác sẽ là khi bạn muốn dispatchvà hành động khi trạng thái thay đổi. bạn sẽ muốn thực hiện nó trong một cuộc gọi lại chứ không phải render()vì nó sẽ được gọi mỗi lần tái xuất hiện và do đó nhiều kịch bản như vậy có thể xảy ra khi bạn sẽ cần gọi lại.
Một trường hợp khác là một API Call
Một trường hợp có thể phát sinh khi bạn cần thực hiện lệnh gọi API dựa trên thay đổi trạng thái cụ thể, nếu bạn thực hiện điều đó trong phương thức kết xuất, nó sẽ được gọi trên mỗi onStatethay đổi kết xuất hoặc do một số Prop được chuyển sang Child Componentthay đổi.
Trong trường hợp này, bạn sẽ muốn sử dụng một setState callbackđể chuyển giá trị trạng thái được cập nhật cho lệnh gọi API
....
changeTitle: function (event) {
this.setState({ title: event.target.value }, () => this.APICallFunction());
},
APICallFunction: function () {
// Call API with the updated value
}
....