是的,因为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 调用时,可能会出现这种情况,如果您在 render 方法中这样做,它将在每次渲染 onState 更改时调用,或者因为某些 Prop 传递给Child Component 已更改。
在这种情况下,您可能希望使用 setState callback 将更新后的状态值传递给 API 调用
....
changeTitle: function (event) {
this.setState({ title: event.target.value }, () => this.APICallFunction());
},
APICallFunction: function () {
// Call API with the updated value
}
....