React中面试常见的问题----setState是同步还是异步?

在React中,如果是由React引发的事件处理(比如通过onClick引发的事件处理、各生命周期),调用setState不会同步更新this.state,

除此之外的setState调用会同步执行this.state 。所谓“除此之外”,指的是绕过React通过addEventListener直接添加的事件处理函数,还有通过setTimeout/setInterval产生的异步调用。

原因
在React的setState函数实现中,会根据一个变量isBatchingUpdates判断是直接更新this.state还是放到队列中回头再说

isBatchingUpdates默认是false,也就表示setState会同步更新this.state,

但是,有一个函数batchedUpdates,这个函数会把isBatchingUpdates修改为true,而当React在调用事件处理函数之前就会调用这个batchedUpdates,造成的后果,就是由React控制的事件处理过程setState不会同步更新this.state。

setState它本身的方法调用是同步的,但是并不代表着调用了setState后,state立刻就更新了,这个更新是要根据我们当前执行环境的上下文来确定的。

  • 如果我处于批量更新的情况下,那我的state就不是立马更新了;
  • 如果我不处于这个批量更新的情况下,那就有可能是立马更新了,但也不一定,比如说,这里我处于一个异步渲染的情况下,

为了让避免这种情况,可以使用setState中传入一个回调函数作为第二个参数来解决

this.setState({
      value:100
},()=>{
   //这个回调函数会在更新状态时执行,所以可以获取到最新的值
})
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值