在React
中,setState
既可以是同步的也可以是异步的,这取决于执行时机和执行的上下文
[1]. setState
的异步并不是指内部由异步代码实现的,实际上执行的过程和代码都是同步的,只是合成事件和钩子函数调用的顺序在更新之前,导致在合成事件和钩子函数中不能立即看到state
的变化,而在原生事件和setTimeout
中,setState
是同步的
[2]. 在React17
中,setState
是批量执行的,因为执行前会设置executionContext
,但如果在setTimeout
,事件监听器等函数中,就不会设置executionContext
的,这时候setState
会同步执行,可以在外面包一层batchUpdates
函数,手动设置下excutionContext
来切换成异步批量执行
[3]. 在React
的渲染流程中,setState
会创建update
对象挂到fiber
对象上,然后耨调度performSyncWorkOnRoot
重新渲染,一个主要任务的先后顺序是:render
阶段render
函数执行-->commit
阶段真实