我在使用React.js时遇到了一些问题,即在调用setState()时状态不能立即设置。我不确定是否有更好的方法来解决这个问题,或者它是否真的只是React的一个缺陷。我有两个状态变量,其中一个基于另一个变量。(原始问题的演示: http://jsfiddle.net/kb3gN/4415/ 你可以在日志中看到当你点击按钮时,状态并没有立即设置)
setAlarmTime: function(time) {
this.setState({ alarmTime: time });
this.checkAlarm();
},
checkAlarm: function() {
this.setState({
alarmSet: this.state.alarmTime > 0 && this.state.elapsedTime < this.state.alarmTime
});
}, ...
在调用setAlarmTime
时,由于this.state.alarmTime
不会立即更新,因此对checkAlarm
的紧随其后的调用基于this.state.alarmTime
的先前值进行设置,因此是不正确的。
我通过将checkAlarm
的调用移动到setAlarmTime
的setState
回调中来解决这个问题,但必须跟踪哪个状态实际上是“正确”的,并尝试将所有内容都适合回调似乎很荒谬:
setAlarmTime: function(time) {
this.setState({ alarmTime: time }, this.checkAlarm);
}
有更好的方法吗?我的代码中还有几个地方引用了我刚设置的状态,现在我不确定何时可以信任这个状态!
谢谢
this.state
将完全更新。但是,在我的情况下,我认为这不起作用,因为该组件实际上具有自己的更新循环(使用setInterval),必须在每个tick中更新和检查其状态。因此,不能保证在tick之间运行render
。为了解决这个问题,我实现了一个包装器React.createClass
来跟踪它自己的状态。我也会将它添加到答案中http://jsfiddle.net/kb3gN/4448/ - Andrew