setState是一个合成事件,react为了解决跨平台,兼容性问题,自己封装了一套事件机制,代理了原生的事件,像在jsx中常见的onClick、onChange这些都是合成事件。
在一个事件handler中,不管setState会调用多少次,他们也会在函数执行后执行,被归结为一次渲染
可以优化性能, 这个等到最后一起执行的行为被称为batching。
1 |
|
所以这时候要更新的话,应该传入一个函数给setState,这个函数有2个参数,第一个是previousState,第二个为props.
1 | // 假设 this.state = { value: 0 }; |
当setState不在事件handler中,而在一个回调中,这样的batching异步就不会发生
1 | promise.then(() => { |
####batchUpdate
batchUpdate的本质是一个批量更新
Batch Update 即「批量更新」。在 MV* 框架中,Batch Update 可以理解为将一段时间内对 model 的修改批量更新到 view 的机制。以 React 为例,我们在 componentDidMount 生命周期连续调用 setState :
React中的batch update是通过一个事务机制来实现的。
Transaction对一个函数进行包装,让react有机会在一个函数运行前后执行特定的逻辑。从而完成整个 Batch Update 流程的控制。
在事务初始化状态,一个update Queue被创建,调用setState方法的时候,不会马上跟新。而是被推入update Queue当中。当执行结束后会执行queue的flush操作,进行setState赋值。