前端开发那些事儿

React 中 setState 是同步的还是异步的的?

2021-03-28  本文已影响0人  弱冠而不立

首先说结论,不同模式下有不同的结果
在 React 的官网,在有关 Concurrnt 模式下这一章的介绍中能看到,当前 React 为了平滑的迁移到 Fiber 架构,推出了三个模式进行过渡。

传统(legacy)模式下

结论

可以查看这个示例看一下:codesandbox示例

原因

React 有个性能优化的特性:批量更新(batchedUpdates)
简单描述一下场景就是,当你在一个React事件里触发多次 setState 执行状态的更新操作,那么只有最后一次的 setState 能被真正的更新到。
简单概括一下就是,React将一个事件里的多次 setState 合并为一次更新。

那为什么使用 setTimeout 包裹就可以使得 setState 变成同步更新的呢?
首先明白JS的事件执行机制,同步任务和异步任务是两个不同的机制。同步函数执行时,压入函数执行栈;异步任务进入事件队列。

Concurrent 模式下

结论

无论什么情况下,setState 都是异步的(都是批量更新的)
在线Demo查看:react版本选择的是实验性的版本

在源码中,legacy 模式下更新的优先级是同步的,而 concurrent 模式下更新的优先级是异步的(详情可以看:React 实验阶段的 Concurrent 模式)。从而在源码中走的条件判断不一样。

简要概括就是:传统模式下 React 需要先判断当前的函数执行上下文有没有 setState ,有的话然后再进行批量更新。而 Concurrent 模式下,只要是 setState 都是批量更新的。

上一篇下一篇

猜你喜欢

热点阅读