答:有时候是同步的,有时候是异步的
- setState只在合成事件和钩子函数中是异步的,而在原生事件和setTimeout中是同步的。
- setState是异步的并不是说是由异步代码实现的,其实本身执行的过程和代码都是同步的。只是合成事件和钩子函数的调用顺序是在更新之前,导致合成函数和钩子函数没有办法立马拿到更新后的值,形成了所谓的异步。 在原生事件和setTimeout中就不会这样,呈现同步状态。
export class Ev extends React.Component(){
constructor(){
this.state={
num:0
}
}
componentDidMount(){
this.btn.addEventLisener("click",()=>{
this.setState({num:this.state.num+1})
console.log("button2",this.state.num)// 1
})
}
render(){
return(
<div>
<button onClick={()=>{
this.setState({num:this.state.num+1})
console.log("button1",this.state.num)// 0
}}>button1</button>
<button ref={(e)=>{this.btn = e}}>button2</button>
</div>
)
}
}
在上述代码中我们通过打印可以看到button1并没有立即打印出更改后的数据,但是button2可以,这就是在合成事件是异步的,在原生事件是同步的(其实就是抓取数据的时间的区别)。