xuchaobei / react-book

《React进阶之路》示例代码
281 stars 143 forks source link

第4章 state 的更新是异步的 #5

Closed ycshill closed 6 years ago

ycshill commented 6 years ago
  1. 这个购物车数量增加的例子能够模拟吗,理论上是理解的,但是想模拟一下
  2. 一般的计数,万无一失的犯法都是用this.setState((preState, props) => ({counter: preState.quantity + 1}))
xuchaobei commented 6 years ago

当然可以了,自己写下代码就可以验证。多写比多看更加重要。

ycshill commented 6 years ago

我写了计数的代码,连续点击2次是2啊,还有看书中的写法都是this.setState((preState) => ({users: preState.users})) 这种使用preState传参数的方式,这个很还有必要吗?

xuchaobei commented 6 years ago

书中的举例有问题,点击两次,确实会增加2,虽然state的更新是异步的,但第二次点击时,第一次点击导致的state更新已经完成,所以会加2。

你可以用下面的代码来帮助理解state更新的异步性。handleClick是点击按钮的事件响应函数,函数内部调用了两次setState,第一次调用后,this.state的值并不是立即改变,所以第二次调用时,this.state的值还是老的值,最终两次setState的调用只会让quantity增加1。

  handleClick = () => {
    this.setState({
      quantity : this.state.quantity + 1
    })
    this.setState({
      quantity : this.state.quantity + 1
    })
  }
ycshill commented 6 years ago

好的,明白了,谢谢