React--setState是同步还是异步?
在react中,原生js监听事件中的setState是同步的,如addEventListener、setTimeout等
而在react控制的事件处理函数中,setState是异步的,如onClick等
setState有两种设置方式,
- setState传入对象,直接修改state中的数据
- 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