当前位置: 首页 > news >正文

setState是同步更新还是异步更新

setState是同步更新还是异步更新

  • 先说结论
  • setState为什么设计为异步
  • react18之前为什么不确定是同步还是异步呢
  • react18之后setState有哪些改动

先说结论

React18之前:使用了ReactDOM.rendersetStateReact调度流程中是异步更新,在原生事件和setTimeout中是同步更新。
React18:使用ReactDOM.createRoot,默认都是批量更新,也就是异步更新。

React18之前,setState在原生事件和定时器中是同步的,在合成事件和生命周期函数里面是异步的,原理在于合成事件和生命周期函数调用顺序在批处理和更新之前,导致在合成事件和生命周期函数里没法立刻拿到更新后的值,导致形成所谓的异步

setState为什么设计为异步

1. 提升性能
如果每次调用setState都进行一次更新,意味着render函数会被频繁调用,界面重新渲染,最好的方法就是获取到多个更新之后,批量进行更新
2. 保持state和props同步
如果同步更新了state,但是还没有执行render函数,那么stateprops不能保持同步

react18之前为什么不确定是同步还是异步呢

React中,如果是由React引发的事件处理(比如通过onClick引发的事件处理),调用setState不会同步更新this.state;如果是绕过React通过addEventListener直接添加的事件处理函数,还有通过setTimeout/setInterval产生事件处理,调用setState会同步更新this.state

为什么会出现以上有时同步,有时异步的现象呢

  1. ReactsetState函数实现中,会根据一个变量isBatchingUpdates判断是直接更新this.state还是放到队列中回头再说,
  2. isBatchingUpdates默认是false,也就表示setState会同步更新this.state
  3. 但是,有一个函数batchedUpdates,这个函数会把isBatchingUpdates修改为true
  4. 而当React在调用事件处理函数之前就会调用这个batchedUpdates,从而react控制的事件处理过程setState不会同步更新this.state
  5. 即:setState的“异步”并不是说内部由异步代码实现的,其实本身执行的过程和代码都是同步的,只是合成事件和钩子函数的调用顺序在更新之前,导致在合成事件和钩子函数中没法立马拿到更新后的值,形式了所谓的“异步”,
  6. 当然可以通过第二个参数 setState(partialState, callback) 中的callback拿到更新后的结果。

react18之后setState有哪些改动

  • react18之后,setState都会表现为异步(即批处理)。
  • 批处理:是指 React将多个状态更新分组到单个重新渲染中以获得更好的性能
  • 如果同一点击事件中有两个状态更新,React 总是将它们批处理为一次重新渲染。
http://www.lryc.cn/news/452522.html

相关文章:

  • TCP 流量控制 - 滑动窗口和拥塞控制算法解析
  • MongoDB聚合操作及索引底层原理
  • C++ | Leetcode C++题解之第454题四数相加II
  • 【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
  • 谷歌收录查询工具,谷歌收录查询工具的使用指南
  • vue3 拖拽插件(drag)
  • 数据结构--线性表(顺序结构)
  • 面试准备111
  • Spring 的 IOC 和 AOP 是什么,有哪些优点?解密 Spring两大核心概念:IOC与AOP的魅力所在
  • 第二百六十四节 JPA教程 - JPA查询日期参数示例
  • Spring MVC的运行流程详解
  • 判断有向图是否为单连通图的算法
  • php与python建站的区别有哪些
  • 模型评估与验证:确保模型在未知数据上的表现----示例:使用K折交叉验证评估分类模型、房价预测问题使用K折交叉验证来评估一个线性回归模型的性能
  • awd基础学习
  • C#基于SkiaSharp实现印章管理(10)
  • 通过栈实现字符串中查找是否有指定字符串的存在
  • MongoDB伪分布式部署(mac M2)
  • Golang | Leetcode Golang题解之第454题四数相加II
  • [ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷
  • Linux 系统 nvm 管理node无法使用
  • 信号处理快速傅里叶变换(FFT)的学习
  • vue3项目el-table表格行内编辑加输入框校验
  • 【Node.js】内置模块FileSystem的保姆级入门讲解
  • 问:LINUXWINDOWS线程CPU时间如何排序?
  • postgresql-重复执行相同语句,试试 prepare!
  • wpf加载带材料的3D模型(下载的3D预览一样有纹理)
  • 【k8s之深入理解调度】调度框架扩展点理解
  • 音视频基础理论
  • 《江苏科技大学学报(自然科学版)》