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

React中 setState 是同步的还是异步的?调和阶段 setState 干了什么?

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

  • 1. React 的 setState 是异步的
  • 2. 为什么 setState 在合成事件和生命周期函数中是异步的
  • 3. 为什么 setState 在原生事件和定时器中是同步的
  • 4. 为什么要这样设计?
  • 调和阶段是什么
  • setState在调和阶段干了什么?
  • 总结:

1. React 的 setState 是异步的

在 React 中,setState 并不是立即更新组件的状态,而是被放入一个更新队列。React 会批量处理这些更新,以提高性能。这种更新行为在一些情况下是异步的,特别是在某些事件回调或生命周期函数中。

2. 为什么 setState 在合成事件和生命周期函数中是异步的

React 的合成事件(Synthetic Events)和生命周期方法(如 componentDidMount、componentDidUpdate)是与 React 的事件处理和渲染周期紧密相关的。当你在这些地方调用 setState 时,React 会将更新加入到事件循环的下一轮,这样做是为了批量更新。

批量更新:在一个事件处理或生命周期方法内,React 会将多个 setState 更新合并(或“批处理”),以减少重新渲染的次数。这有助于提升性能,避免因每次状态变更都重新渲染组件。

异步行为:为了支持批量更新,React 会将状态更新的操作排入队列,并异步执行。这意味着,在同一个事件回调内,setState 并不会立即生效。你无法在 setState 之后立即读取到更新后的状态。

举个例子:

handleClick() {this.setState({ count: this.state.count + 1 });console.log(this.state.count); // 这里输出的值是旧的,因为setState是异步的
}

React 会将状态更新的操作放到事件队列中,等事件处理完后再批量执行更新。这就意味着,this.state.count 在 console.log 时,仍然是更新前的值。

3. 为什么 setState 在原生事件和定时器中是同步的

在原生事件和定时器中,React 选择了同步更新状态。这是因为 React 的更新机制和原生事件及定时器的执行机制有所不同。

原生事件:当你在原生事件(如 click、keydown 等)中调用 setState 时,React 会同步执行更新。这是因为原生事件是浏览器的事件系统,不依赖于 React 的事件系统批处理机制,因此 React 会立即执行状态更新并重新渲染组件。

定时器:setTimeout 或 setInterval 等定时器回调函数也是同步的,因为它们是在 JavaScript 执行队列中排队的,React 在这些情况下也会直接处理状态更新。

举个例子:

handleClick() {setTimeout(() => {this.setState({ count: this.state.count + 1 });console.log(this.state.count); // 此时输出的是新的值}, 0);
}

在这个例子中,由于 setState 是在 setTimeout 回调中调用的,React 会在这个回调执行完之后立即同步更新状态并重新渲染。

4. 为什么要这样设计?

React 设计这种行为是为了优化性能。通过将 setState 更新合并、批量处理,React 能减少不必要的重新渲染,从而提高性能。在合成事件和生命周期方法中,React 能够在事件循环的下一轮批量更新所有状态,避免频繁渲染。

而在原生事件和定时器中,React 选择同步更新,是为了避免与浏览器的原生事件处理和定时器队列发生冲突。如果 setState 在这些场景中是异步的,可能会导致不符合预期的渲染行为。

调和阶段是什么

调和阶段是 React 渲染过程中,从旧的虚拟 DOM 到新的虚拟 DOM 的比较过程。React 会根据新状态或新属性重新计算出组件的虚拟 DOM 树,并与当前的虚拟 DOM 树进行对比,然后通过差异算法(也叫做Diffing 算法)来找到两者之间的差异,最终生成最小的更新策略,然后将更新应用到真实 DOM 上。

setState在调和阶段干了什么?

  • 调和阶段 是 React 更新流程中的一部分,负责比较旧的虚拟 DOM 和新的虚拟 DOM,计算出需要更新的最小差异,并将这些差异应用到真实 DOM 上。
  • setState 是触发更新的机制,通过异步更新和批处理,React 能高效地更新组件状态并重新渲染 UI。
  • setState 的工作原理和调和过程密切相关,setState 更新的状态最终通过调和过程影响虚拟 DOM 的变化,并应用到真实 DOM 上。

总结:

合成事件和生命周期函数中:setState 是异步的,React 会批量处理更新以提高性能。
原生事件和定时器中:setState 是同步的,React 会立即执行状态更新,以避免与原生事件的同步执行发生冲突。
这种设计主要是为了平衡性能和正确的行为,确保 React 在不同场景下都能高效、可预测地工作。

相关文章:

React中 setState 是同步的还是异步的?调和阶段 setState 干了什么?

React中 setState 是同步的还是异步的 1. React 的 setState 是异步的2. 为什么 setState 在合成事件和生命周期函数中是异步的3. 为什么 setState 在原生事件和定时器中是同步的4. 为什么要这样设计?调和阶段是什么setState在调和阶段干了什么?总结&…...

【D3.js in Action 3 精译_040】4.4 D3 弧形图的绘制方法

当前内容所在位置: 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建(上篇) 4.1.1 D3 中的边距约定(中篇)4.1.2 坐标轴的生成(中篇) 4.1.2.1 比例尺的声明(中篇)4.1…...

C++设计模式:抽象工厂模式(风格切换案例)

抽象工厂模式(Abstract Factory)是一种创建型设计模式,其核心思想是:为一组相关或相互依赖的对象提供一个创建接口,而无需指定它们具体的类。简单来说,就是一个工厂可以生产一系列相关的对象。 我们接下来…...

搜维尔科技:Xsens随时随地捕捉,在任何环境下实时录制或捕捉

Xsens随时随地捕捉,在任何环境下实时录制或捕捉 搜维尔科技:Xsens随时随地捕捉,在任何环境下实时录制或捕捉...

爬虫基础总结 —— 附带爬取案例

Crawler —— Learning experience 数据的传输: 在OSI七层模型中,传输层为源主机和目标主机之间提供可靠的数据传输和通信服务,在该层中,有两个重要的协议—— TCP与 UDP协议。 TCP协议(传输控制协议) …...

图像处理学习笔记-20241118

文章目录 霍夫变换基本原理霍夫变换的步骤使用 OpenCV 实现直线检测示例:标准霍夫变换 示例:概率霍夫变换参数解释霍夫变换检测圆 基于GAN的样本生成GAN的基本原理基于GAN的数据增广流程实现代码示例 同态滤波(Homomorphic Filtering&#xf…...

不能打开网页,但能打开QQ、微信(三种方式)

1.VPN错误 下面三个开关全关闭 2.DNS问题 WINR 输入CMD打开命令行 命令行输入 ipconfig/flushdns 重启电脑 3.直接火绒(一键修复)...

使用 start-local 脚本在本地运行 Elasticsearch

警告:请勿将这些说明用于生产部署 本页上的说明仅适用于本地开发。请勿将此配置用于生产部署,因为它不安全。请参阅部署选项以获取生产部署选项列表。 使用 start-local 脚本在 Docker 中快速设置 Elasticsearch 和 Kibana 以进行本地开发或测试。 此设…...

计算机网络:概述知识点及习题练习

网课资源: 湖科大教书匠 1、因特网 网络之间需要路由器进行互联,互联网是网络的网络,因特网是最大的互联网,连接到网络的设备称为主机,一般不叫路由器为主机。 因特网发展:ARPNET->三级结构因特网&am…...

python蓝桥杯刷题2

1.最短路 题解:这个采用暴力枚举,自己数一下就好了 2.门牌制作 题解:门牌号从1到2020,使用for循环遍历一遍,因为range函数无法调用最后一个数字,所以设置成1到2021即可,然后每一次for循环&…...

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问,到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列(蛋白质、有机物、rna、dna、mrna)的多模态…...

KF UKF

我需要Kalman 现在,主要是用来处理检测问题情况里的漏检,因为模拟了一段2D, (x,y)的数据,为了看效果,画的线尽量简单一点: import numpy as np import matplotlib.pyplo…...

中伟视界:AI智能分析算法如何针对非煤矿山的特定需求,提供定制化的安全生产解决方案

非煤矿山智能化改造,除了政策文件,上级监管单位需要安装的AI智能分析算法功能之外的,矿方真正关心的,能解决矿方安全生产隐患的AI智能分析算法功能有哪些呢? 经过与矿方的现场交流沟通,收集第一现场人员对安…...

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失 Addressable Play Mode Script加载模式 选择 Use Existiing Build 1.Unity 切换到 PC 平台,执行 Addressable Build 运行,加载 bundle 内的预制体 显示正常 2.Unit…...

Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 优化场景定义

Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 & 优化场景定义 前言一、功能文件路径的配置1.1 全局设置功能文件路径1.2. 在场景中覆盖路径 二、避免重复输入功能文件名2.1 使用方法2.2 functools.partial 的背景 三、应用场景总…...

rust逆向初探

rust 逆向葵花宝典 rust逆向技巧 rust逆向三板斧: [!NOTE] 快速定位关键函数 (真正的main函数):观察输出、输入,字符串搜索,断点等方法。定位关键 加密区 :根据输入的flag,打硬件断点,快速捕获…...

【Linux】apt 关闭 ssl 认证

【注意】apt 关闭 ssl 认证可能会引起软件安装风险,请尽量避免关闭。 执行以下命令可以实现全局关闭 sll 验证。 echo Acquire::https::Verify-Peer "false"; >> /etc/apt/apt.conf.d/99disable-signature-verificationecho Acquire::https::Verif…...

【算法】P5018 对称二叉树

题目 P5018 对称二叉树 https://www.luogu.com.cn/problem/P5018 代码 思路:领接表存储二叉树,unordered_map存储各个节点对应的值。dfs遍历一下各个子树的大小个数,再写个递归判断是否是对称二叉树,如果是就更新全局答案。 #…...

Unifying Top-down and Bottom-up Scanpath Prediction Using Transformers

Abstract 大多数视觉注意力模型旨在预测自上而下或自下而上的控制,这些控制通过不同的视觉搜索和自由观看任务进行研究。本文提出了人类注意力变换器(Human Attention Transformer,HAT),这是一个能够预测两种形式注意力…...

JavaSE(十四)——文件操作和IO

文章目录 文件操作和IO文件相关概念Java操作文件文件系统操作文件内容操作字节流FileOutputStreamFileInputStream代码演示 字符流FileWriterFileReader代码演示 缓冲流转换流 案例练习 文件操作和IO 文件相关概念 文件 通常指的是包含用户数据的文件,如文本文件、…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...