react中的setState是同步还是异步,以及setState之后都发生了什么

 

setState 只在合成事件和钩子函数中是“异步”的,在原生事件和 setTimeout 中都是同步的。

  • 合成事件:就是react 在组件中的onClick等都是属于它自定义的合成事件
  • 原生事件:比如通过addeventListener添加的,dom中的原生事件

setState的“异步”并不是说内部由异步代码实现,其实本身执行的过程和代码都是同步的,只是合成事件和钩子函数的调用顺序在更新之前,导致在合成事件和钩子函数中没法立马拿到更新后的值,形式了所谓的“异步”,当然可以通过第二个参数 setState(partialState, callback) 中的callback拿到更新后的结果。

setState 的批量更新优化也是建立在“异步”(合成事件、钩子函数)之上的,在原生事件和setTimeout 中不会批量更新,在“异步”中如果对同一个值进行多次 setState , setState 的批量更新策略会对其进行覆盖,取最后一次的执行,如果是同时 setState 多个不同的值,在更新时会对其进行合并批量更新。
--------------------- 
版权声明:本文为CSDN博主「Jason-Jin」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jjx0224/article/details/88239873

setState之后都发生了什么

  • 1.this.setState(newState) =>
  • 2.newState存入pending队列 =>
  • 3.调用enqueueUpdate =>
  • 4.是否处于批量更新模式 => 是的话将组件保存到dirtyComponents
  • 5.不是的话遍历dirtyComponents,调用updateComponent,更新pending state or props
  • enqueueUpdate的源码如下:
 
  1.  function enqueueUpdate(component){

  2. //injected注入的

  3. ensureInjected();

  4. //如果不处于批量更新模式

  5. if(!batchingStrategy.isBatchingUpdates){

  6. batchingStrategy.batchedUpdates(enqueueUpdate, component);

  7. return;

  8. }

  9. //如果处于批量更新模式

  10. dirtyComponents.push(component);

  11. }

  • 如果isBatchingUpdates为false,则对所有队列中的更新执行batchedUpdates方法,否则只把当前组件(即调用了setState的组件)放入dirtyComponents数组中。
  • 连续调用了多次setState,但是只引发了一次更新生命周期,因为React会将多个this.setState产生的修改放在一个队列里,缓一缓,攒在一起,觉得差不多了在引发一次更新过程。所以攒的过程中如果你不停的set同一个state的值,只会触发最后一次,

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值