Javascript 如何在setState(updater[,callback])中正确调用回调?
因此,我一直在努力将回调传递给Javascript 如何在setState(updater[,callback])中正确调用回调?,javascript,reactjs,callback,setstate,Javascript,Reactjs,Callback,Setstate,因此,我一直在努力将回调传递给this.setState(),因为我是这样做的: this.setState({anyState},this.anyFunction()) 调用了该函数,但在状态更新后没有真正调用它。结果,当我在我的anyFunction中更新相同的anyState时,两个状态更新之间存在某种冲突,只有第一个状态更新有效 然后我发现我必须这样做 this.setState({anyState},()=>this.anyFunction()) 或者 this.setState({a
this.setState()
,因为我是这样做的:
this.setState({anyState},this.anyFunction())代码>
调用了该函数,但在状态更新后没有真正调用它。结果,当我在我的anyFunction
中更新相同的anyState
时,两个状态更新之间存在某种冲突,只有第一个状态更新有效
然后我发现我必须这样做
this.setState({anyState},()=>this.anyFunction())代码>
或者
this.setState({anyState},function(){this.anyFunction()})代码>
使事情正常运转
为什么会这样?为什么我的第一种方法似乎是错误的?第一种方法将调用的结果作为回调传递给this.anyFunction
。很可能,这不是你想要的
要解决此问题,您需要删除括号,即将代码更改为:
this.setState({ anyState }, this.anyFunction);
但是,这有一个问题,即anyFunction
中的this
绑定将不再指向类实例。要解决此问题,您需要将anyFunction
声明为箭头函数,或者显式绑定this
第一种方法将调用结果作为回调传递给this.anyFunction
。很可能,这不是你想要的
要解决此问题,您需要删除括号,即将代码更改为:
this.setState({ anyState }, this.anyFunction);
但是,这有一个问题,即anyFunction
中的this
绑定将不再指向类实例。要解决此问题,您需要将anyFunction
声明为箭头函数,或者显式绑定此
在第一个示例中,您使用函数的结果作为第二个参数
说this.anyFunction
返回一个常量“some_text”
,使用
this.setState({ anyState }, this.anyFunction());
与使用相同
this.setState({ anyState }, "some_text");
在第二个示例中,您实际上是在传递回调。或函数作为参数。该函数尚未执行,将在setState()末尾执行
有关异步编程和回调的更多信息,请观看以下对话:在第一个示例中,您使用函数的结果作为第二个参数
说this.anyFunction
返回一个常量“some_text”
,使用
this.setState({ anyState }, this.anyFunction());
与使用相同
this.setState({ anyState }, "some_text");
在第二个示例中,您实际上是在传递回调。或函数作为参数。该函数尚未执行,将在setState()末尾执行
有关异步编程和回调的更多信息,请观看以下对话:this.anyFunction()
执行函数()=>此.anyFunction()
延迟函数执行。由于setState
需要回调,因此您应该给它一个函数引用,而不是通过this.anyFunction()
立即执行该函数,该函数将传入this.anyFunction
的任何返回值,或者undefined
如果没有显式的return
语句。我猜您一直在调用函数,没有在this.setState({anyState},this.anyFunction())中传递对它的引用代码>“如何正确调用回调”-这正是问题所在。你应该传递一个回调函数,你不应该自己调用它。谢谢@vlaz,清澈见底。如果可以,把它作为答案,然后我可以验证它。现在清楚多了this.anyFunction()
执行该函数()=>此.anyFunction()
延迟函数执行。由于setState
需要回调,因此您应该给它一个函数引用,而不是通过this.anyFunction()
立即执行该函数,该函数将传入this.anyFunction
的任何返回值,或者undefined
如果没有显式的return
语句。我猜您一直在调用函数,没有在this.setState({anyState},this.anyFunction())中传递对它的引用代码>“如何正确调用回调”-这正是问题所在。你应该传递一个回调函数,你不应该自己调用它。谢谢@vlaz,清澈见底。如果可以,把它作为答案,然后我可以验证它。现在清楚多了!我认为约束的必要性取决于具体情况。例如,如果setState
出现在componentDidmount
或任何其他绑定方法中,则无需在此处绑定anyFunction
。我认为绑定的必要性取决于具体情况。例如,如果setState
出现在componentDidmount
或任何其他绑定方法中,则无需在此处绑定anyFunction
。