setState是异步还是同步

293 阅读1分钟

在React中,如果是由React引发的事件处理(比如通过onClick引发的事件处理,componentWillMount等生命周期),调用setState不会同步更新this.state;除此之外的setState调用会同步执行this.state。所谓“除此之外”,指的是绕过React通过addEventListener直接添加的事件处理函数,还有通过setTimeout/setInterval产生的异步调用。

React是怎样控制异步和同步的呢?

在 React 的 setState 函数实现中,会根据一个变量 isBatchingUpdates 判断是直接更新 this.state 还是放到队列中延时更新,而 isBatchingUpdates 默认是 false,表示 setState 会同步更新 this.state;但是,有一个函数 batchedUpdates,该函数会把 isBatchingUpdates 修改为 true,而当 React 在调用事件处理函数之前就会先调用这个 batchedUpdates将isBatchingUpdates修改为true,这样由 React 控制的事件处理过程 setState 不会同步更新 this.state。

在进入生命周期之前,就会调用batchedUpdates(),所以此时isBatchingUpdates已经修改为true了。后面第一次进入setState()时,就会进入加入dirtyComponent中。