因此,我一直在努力将回调传递给this.setState()
,因为我是这样做的:
this.setState({ anyState }, this.anyFunction());
该函数已被调用,但是在状态更新后才真正被调用。结果,由于我还在anyState
中更新相同的anyFunction
,所以两个状态更新之间存在某种冲突,只有第一个状态有效。
然后我发现我必须要么做
this.setState({ anyState }, () => this.anyFunction());
两个
this.setState({ anyState }, function() { this.anyFunction() });
使事情正常运行。
为什么这样?为什么我的第一种方法不对?
答案 0 :(得分:3)
第一种方法将调用结果作为回调传递给this.anyFunction
。很有可能,这不是您想要的。
要解决此问题,您需要删除括号,即将代码更改为此:
this.setState({ anyState }, this.anyFunction);
但是,这有一个问题,this
中的anyFunction
绑定将不再指向类实例。要解决此问题,您需要将anyFunction
声明为箭头函数,或显式绑定this
。
答案 1 :(得分:1)
在第一个示例中,您将函数的结果用作第二个参数。
说this.anyFunction
使用
"some_text"
。
this.setState({ anyState }, this.anyFunction());
与使用
相同this.setState({ anyState }, "some_text");
在第二个示例中,您实际上传递了一个回调。或函数作为参数。该函数尚未执行,它将在setState()的末尾执行。
有关异步编程和回调的更多信息,您可以观看此谈话:https://javascript-conference.com/javascriptecmascript/asynchronicity-concurrency/