React--setState是同步还是异步?

在react中,原生js监听事件中的setState是同步的,如addEventListener、setTimeout等

而在react控制的事件处理函数中,setState是异步的,如onClick等

setState有两种设置方式,

  1. setState传入对象,直接修改state中的数据
  2. setState中传入两个函数,第一个函数有两个参数,第一个参数是当前的state,第二个参数是当前的props,返回的是要修改的state对象,类似于第一种设置方式;第二个函数是更新后的回调函数。

react是如何控制同步还是异步?

react中是根据isBatchingUpdates来设置同步or异步。而isBatchingUpdates默认为false,即默认同步更新。其中有batchedUpdates函数,用来设置isBatchingUpdates

多次连续设置会合并处理

state:{foo : 10}
let foo1 = this.state.foo
this.setState({foo: foo1 + 1})
this.setState({foo: foo1 + 1})
this.setState({foo: foo1 + 1})
// 在最后foo依然为11 因为所有都合并到一次更新,state中的foo只改变了一次

函数传参解决合并问题

state:{foo : 10}
function increment(state, prop){
   return {
      foo: state.foo + 1
   }
}
this.setState(increment)
this.setState(increment)
this.setState{increment)
// foo为13