写过React的都知道,我们在SetTimeout中调用setState时是同步更新state的,这是为什么呢?
并不是setTimeout改变了setState,而是setTimeout帮助setState“逃脱”了React对它的管控(setTimeout的回调异步执行,使得本该在React全局变量isBatchingUpdates为true时执行的,变成了在false执行了,使得当前场景下的setState具备了立刻发起同步更新的能力,类似如下代码),只要是在React管控下的setState,那就一定是异步的。
reduce = () => {
// 进来先锁上
isBatchingUpdates = true
setTimeout(() => {
console.log('reduce setState前的count', this.state.count)
this.setState({
count: this.state.count - 1
});
console.log('reduce setState后的count', this.state.count)
},0);
// 执行完函数再放开
isBatchingUpdates = false
}