React中的setState都做了什么,同步还是异步?

setState能做什么?

  • 首先setState的出现是因为,React并不会绑定视图和state,需要手动去更新视图,所以setState就出现了,它帮助我们更改数据的同时并且通知视图进行渲染。
  • 第二个能力是性能优化,可以认为setState是异步的,React在setState之后,会经对state进行diff,判断是否有改变,然后去diff dom决定是否要更新UI。如果这一系列过程立刻发生在每一个setState之后,就可能会有性能问题。在短时间内频繁setState。React会将state的改变压入栈中,在合适的时机,批量更新state和视图,达到提高性能的效果。(简单理解为批量处理,或者延迟处理)

推荐阅读React setState 实现机制及循环调用风险

React中的setState什么时候是同步的,什么时候是异步的

这是所说的同步异步,并不是真正的同步异步,它还是同步执行的。
这是的异步指的是多个state合到一起进行批量更新。

在React中,如果是由React引发的事件处理(比如是通过onClick引发的事件处理,以及生命周期函数调用setState),调用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。

在这里插入图片描述

补充:什么是批量更新 Batch Update 和 vue的批量更新体现

批量更新 Batch Update

在一些mv*框架中,,就是将一段时间内对model的修改批量更新到view的机制。比如那前端比较火的React、vue(nextTick机制,视图的更新以及实现)为例。

vue的批量更新体现

  • Mutation Observer(变动观察器)是监视DOM变动的接口。当DOM对象树发生任何变动时,Mutation Observer会得到通知。
  • 概念上,它很接近事件。可以理解为,当DOM发生变动会触发Mutation Observer事件。但是,它与事件有一个本质不同:事件是同步触发,也就是说DOM发生变动立刻会触发相应的事件;
  • Mutation Observer则是异步触发,DOM发生变动以后,并不会马上触发,而是要等到当前所有DOM操作都结束后才触发。
    这样设计是为了应付DOM变动频繁的情况。举例来说,如果在文档中连续插入1000个段落(p元素),会连续触发1000个插入事件,执行每个事件的回调函数,这很可能造成浏览器的卡顿;
  • 而Mutation Observer完全不同,只在1000个段落都插入结束后才会触发,而且只触发一次。

参考文献:

majunchang: react 常见setState的原理解析
牧码的星星: React中的setState简析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaxLoongLvs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值