详解React中的setState是同步or异步?

每依北斗望京华灬 2020-10-16 05:37:17
谈到React,就不得不提到React中最重要的一个API方法——setState,setState 在 React 中是经常使用的一个 API,但是它存在一些的问题经常会导致初学者出错,核心原因就是因为这个 API 是异步的。
但其实setState也有同步执行的时候,假如setState出现在我们代码自定义的dom事件中以及在setTimeout时,实际上setState是同步执行的:

bodyClick = () =>{
this.setState({
count:this.state.count+1,
)}
console.log(this.state.count);//理论上 我们在setState之后立即打印 是得不到最新结果的 但是这里可以拿到+1之后的count,代码是同步执行的。
}
componentWillMount(){
document.body.addEventListener('click',this.bodyClick);
setTimeout(()=>{
this.setState({
count:this.state.count+1,
)}
console.log(this.state.count);//理论上 我们在setState之后立即打印 是得不到最新结果的 但是这里可以拿到+1之后的count,代码是同步执行的。
})
}

看到这里不要迷糊,其实如果去深究setState的实现方式你就会发现这种情况并不奇怪,setState其实是被react特意设计成一种异步的实现方式,目的是为了避免dom的频繁渲染(就比如连续多次调用setState会进行合并一样,我们后边会说),其实setState是异步还是同步执行,react内部有一个判断标准,这个标准是判断执行setState代码时,是否处于batch update状态,isBatchingUpdates是否被激活:
setState主流程


哪些能命中batchUpdate机制:
1、生命周期(以及生命周期调用的函数)
2、React中注册的时间(和它调用的函数)
3、React可以管理的入口
哪些不能命中batchUpdate机制:
1、setTimeout setInterval等( 以及调用的函数)
2、自定义的DOM事件(和它调用的函数)
3、React管不到的入口
...全文
135 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

87,996

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧