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

server/2024/10/17 16:44:01/

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.ppmy.cn/server/128059.html

相关文章

【C++ 真题】B2005 字符三角形

字符三角形 题目描述 给定一个字符,用它构造一个底边长 5 5 5 个字符,高 3 3 3 个字符的等腰字符三角形。 输入格式 输入只有一行,包含一个字符。 输出格式 该字符构成的等腰三角形,底边长 5 5 5 个字符,高 …

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…

【论文笔记】Visual Instruction Tuning

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Visual Instruction Tunin…

聚星文社——绘唐科技有什么区别!

聚星文社和绘唐科技是两个不同的公司,有一些区别。下面是它们的一些区别: 绘唐科技——聚星文社https://iimenvrieak.feishu.cn/docx/ZhRNdEWT6oGdCwxdhOPcdds7nof 行业领域:聚星文社主要从事文化娱乐行业,包括出版、影视制作等&…

[Leetcode LCR188.][Medium]-买卖芯片的最佳时机-dp/状态压缩

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 可以设一个长度为price.length的dp数组,dp[i]表示到第i天时的最大利润。因为买入操作只能在卖出操作之前完成,因此需要记录下遍历prices数组到第i天时历史最低价格minp,每次遍历都要更新历史…

【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)

总览 1.下载和解决依赖问题 2.修改相关参数 3.安装过程 一、下载和解决依赖问题 1.下载 去这里看看,填写相关的显卡参数,选择 linux 版本,然后开始下载。 https://www.nvidia.cn/drivers/lookup/ 进入这个选择界面: 开始下载&…