setState是同步的还是异步的

146 阅读1分钟

答:有时候是同步的,有时候是异步的

  • 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可以,这就是在合成事件是异步的,在原生事件是同步的(其实就是抓取数据的时间的区别)。