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的nextTick机制 https://www.cnblogs.com/hity-tt/p/6729118.html
-
html5新特性变动观察器 http://www.cnblogs.com/jscode/p/3600060.html
vue的批量更新体现
- Mutation Observer(变动观察器)是监视DOM变动的接口。当DOM对象树发生任何变动时,Mutation Observer会得到通知。
- 概念上,它很接近事件。可以理解为,当DOM发生变动会触发Mutation Observer事件。但是,它与事件有一个本质不同:事件是同步触发,也就是说DOM发生变动立刻会触发相应的事件;
- Mutation Observer则是异步触发,DOM发生变动以后,并不会马上触发,而是要等到当前所有DOM操作都结束后才触发。
这样设计是为了应付DOM变动频繁的情况。举例来说,如果在文档中连续插入1000个段落(p元素),会连续触发1000个插入事件,执行每个事件的回调函数,这很可能造成浏览器的卡顿; - 而Mutation Observer完全不同,只在1000个段落都插入结束后才会触发,而且只触发一次。