异步情况 在React事件当中是异步操作
生命周期和合成事件中
- 无论调用多少次
setState
,都会不会立即执行更新,而是将要更新的·存入_pendingStateQueue
,将要更新的组件存入dirtyComponent
。 - 当上一次更新机制执行完毕,以生命周期为例,所有组件,即最顶层组件
didmount
后会将批处理标志设置为false
。这时将取出dirtyComponent
中的组件以及_pendingStateQueue
中的state
进行更新。这样就可以确保组件不会被重新渲染多次。 setState
本身并不是异步的,而是React
的批处理机制给人一种异步的假象。
同步情况
如果是在setTimeout事件或者自定义的dom事件中,都是同步的
setTimeout(()=>{
this.setState({
count: this.state.count + 1
});
console.log(3,this.state.count);//3
})
new Promise<void>(resolve=>{
this.setState({
count: this.state.count + 1
});
resolve()
console.log(0,this.state.count);//0
}).then(()=>{
this.setState({
count: this.state.count + 1
});
console.log(2,this.state.count);//2
})
document.querySelector('#btn').addEventListener('click',()=>{
this.setState({
count: this.state.count + 1
});
console.log(this.state.count);
});