Có, vì setState
làm việc theo một asynchronous
cách. Đó là phương tiện sau khi gọi setState
các this.state
biế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ì title
biế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 dispatch
và 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 onState
thay đổi kết xuất hoặc do một số Prop được chuyển sang Child Component
thay đổ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
}
....