假设:
cb.setText(String.valueOf(this.position));
this.setState({"data1": ''});
this.setState({"data2": ''});
this.setState({"data3": ''}, this.runMeAfterAllStateUpdatesComplete);
是队列数据结构(FIFO)吗?换句话说,上述代码是安全的,因为setState
将在所有情况下运行最后?或者我是否需要将代码编写为一系列回调:
runMeAfterAllStateUpdatesComplete
或者假设幂等:
this.setState({"data1": ''}, this.setNext);
setNext(){
this.setState({"data2": ''}, this.setNextNext);
}
setNextNext() {
this.setState({"data3": ''}, this.runMeAfterAllStateUpdatesComplete);
}
答案 0 :(得分:0)
第一个代码绝对不安全:setState
是异步操作
在调用第一个setState
之后,反应将在某个时刻重新渲染。因此无法判断第二个setState
是否以及何时会触发。
第三个代码段也存在同样的问题,因为它还连续有多个setState
。
第二个版本可能会有效,但我建议不要以这种方式在回调中做另一个setState
。
正如评论中所建议的那样,对链状态的更多反应方式可能是这样的:
componentDidUpdate() {
if (this.state.data3) {
this.runMeAfterAllStateUpdatesComplete();
} else if (this.state.data2) {
this.setState({ data3 : '' });
} else if (this.state.data1) {
this.setState({ data2 : '' });}
}
}