天天看點

react setState

既是同步也是異步

在事件回調和生命周期函數裡面是異步

在定時器,原生dom事件,promise中是同步

一個函數裡面多次異步setState:

多次次函數模式setState會合并一次

state = {
  count: 0,
}

componentDidMount() {
  this.setState({count: this.state.count + 1})
  this.setState({count: this.state.count + 1})
  console.log('[1]',this.state.count) // 2 ==> 0

  this.setState(state => ({count: state.count + 1}))
  this.setState(state => ({count: state.count + 1}))
  console.log('[2]',this.state.count) // 3 ==> 0

  setTimeout(() => {
    this.setState({count: this.state.count + 1})
    console.log('timeout', this.state.count) // 10 ==> 6

    this.setState({count: this.state.count + 1})
    console.log('timeout', this.state.count) // 12 ==> 7
  }, 0)

  Promise.resolve().then(value => {
    this.setState({count: this.state.count + 1})
    console.log('promise', this.state.count)  // 6 ==>4

    this.setState({count: this.state.count + 1})
    console.log('promise', this.state.count) // 8 ==> 5
  })
}

render() {
  const count = this.state.count
  console.log('render', count)  // 1 ==> 0   4 ==>3   5 ==>4  7 ==>5  9 ==>6  11 ==>7
  return (
    <div>
      <p>{count}</p>
    </div>
  )
}
           

繼續閱讀