同步和异步主要取决于它被调用的环境。
- 在正常的react的事件流里(如onClick等)
setState和useState是异步执行的(不会立即更新state的结果)
多次执行setState和useState,只会调用一次重新渲染render
不同的是,setState会进行state的合并,而useState则不会
- 在
setTimeout/setInterval/Promise.then(fn)/fetch 回调/xhr 网络回调
等原生JS控制的范围里调用
setState和useState是同步执行的(立即更新state的结果)
多次执行setState和useState,每一次的执行setState和useState,都会调用一次render
如果要在某些条件下需要对 JS 控制的区域实现批量更新 ( 异步更新 DOM ) ,那应该怎么做呢?
将代码包裹在 unstable_batchedUpdates 方法的回调函数中就可以实现强制批量更新。
import { unstable_batchedUpdates } from 'react-dom';
setTimeout(() => {
unstable_batchedUpdates(() => {
this.setState({
count: this.state.count+1
})
});
});