使用钩子时,React 批量状态更新功能是否有效?

2024-02-09

对于类组件,this.setState如果在事件处理程序内部,则调用批处理。但是如果状态在事件处理程序之外更新并使用,会发生什么useState hook?

function Component() {
  const [a, setA] = useState('a');
  const [b, setB] = useState('b');

  function handleClick() {
    Promise.resolve().then(() => {
      setA('aa');
      setB('bb');
    });
  }

  return <button onClick={handleClick}>{a}-{b}</button>
}

会渲染吗aa - bb马上?或者它会是aa - b进而aa - bb?


TL;DR– 如果状态更改是异步触发的(例如包含在 Promise 中),则它们不会被批量处理;如果直接触发,则会进行批量处理。

我设置了一个沙箱来尝试一下:https://codesandbox.io/s/402pn5l989 https://codesandbox.io/s/402pn5l989

import React, { Fragment, useState } from 'react';
import ReactDOM from 'react-dom';

import './styles.css';

function Component() {
  const [a, setA] = useState('a');
  const [b, setB] = useState('b');
  console.log('a', a);
  console.log('b', b);

  function handleClickWithPromise() {
    Promise.resolve().then(() => {
      setA('aa');
      setB('bb');
    });
  }

  function handleClickWithoutPromise() {
    setA('aa');
    setB('bb');
  }

  return (
    <Fragment>
    <button onClick={handleClickWithPromise}>
      {a}-{b} with promise
    </button>
    <button onClick={handleClickWithoutPromise}>
      {a}-{b} without promise
    </button>
      </Fragment>
  );
}

function App() {
  return <Component />;
}

const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);

我制作了两个按钮,一个触发包含在承诺中的状态更改,如代码示例中所示,另一个按钮直接触发状态更改。

如果你看一下控制台,当你点击“with Promise”按钮时,它会首先显示a aa and b b, then a aa and b bb.

所以答案是否定的,在这种情况下,它不会渲染aa - bb立即,每个状态更改都会触发新的渲染,没有批处理。

然而,当你点击“withoutpromise”按钮时,控制台会显示a aa and b bb马上。

因此,在这种情况下,React 会批量处理状态更改,并同时对两者进行一次渲染。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用钩子时,React 批量状态更新功能是否有效? 的相关文章

随机推荐

  • JS 对象 this.method() 通过 jQuery 中断

    我确信这个问题有一个简单的答案 但现在是星期五下午 我很累 不确定如何解释它 所以我将继续发布示例代码 这是一个简单的对象 var Bob Stuff init function this Stuff arguments 0 doSomet
  • 将现有的 Maven 项目导入 Eclipse

    我有一个现有的 Maven 项目 我使用 Eclipse Helios 作为我的 IDE 我需要将现有的 Maven 项目导入到我的 IDE 中 请告诉我导入现有 Maven 应用程序的正确方法是什么 我们应该选择 Import Exist
  • 为什么 (new Date() == new Date()) 为 false,而 (Date() == Date()) 为 true? [复制]

    这个问题在这里已经有答案了 我一直在用 JSFiddle 来解决this https www freecodecamp com challenges friendly date rangesFreeCodeCamp 中的问题 当我使用日期作
  • 在数组中查找子数组

    我有数组 array 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 我想找到子数组的索引 1 2 3 4 所以它应该返回值 0但每次我尝试这样做时 它都会返回 1 这是我尝试过的 array indexOf
  • 使用单个 HELM 模板的多个资源

    默认情况下 我们一直对每个应用程序 公共 使用单个入口 但根据最近的要求 我们还需要为某些应用程序公开 私有 端点 这意味着我们有一个如下所示的模板 模板 ingress yaml if Values ingress enabled ful
  • 当替换构造函数执行时, std::Optional 不应该包含它的值吗?

    在实际代码中 构造函数可能非常复杂 因此emplace of a std optional可以查询选项本身的状态 当发生这种情况时 通常会有点复杂 但这里有一个 人为的 最小示例 include
  • 更改 UIAlertView 中取消按钮的位置?

    我注意到 当我从 iPhone 主屏幕删除应用程序时 出现的警报视图左侧显示 删除 按钮 右侧显示 取消 按钮 但是 当我使用 UIAlertView 在应用程序中构建删除功能时 按钮似乎仅显示左侧的 取消 和右侧的 删除 我希望我的应用程
  • Android:获取Facebook好友列表

    我正在使用脸书软件开发工具包 https github com facebook facebook android sdk 在墙上张贴消息 现在我需要获取 Facebook 好友列表 有人能帮我解决这个问题吗 编辑 try Facebook
  • Android 设置视图位置 - setY 与 setTop

    我打算以编程方式移动按钮的位置 按钮处于相对布局 我研究发现我们可以使用 setY or setTop 看起来它们的工作原理应该是一样的 但就我而言 setTop 根本不改变位置并且 setY 仅有效 我不确定我误解了什么 但这对我来说很奇
  • 如何摆脱 VS Code 中的“同步更改 1 ↑”按钮?

    最近 由于某种原因 每次我想要将更改推送到 GitHub 存储库时 我都必须按此按钮 我不记得是否有一个设置是我不小心切换的 我也从未在 VS Code 环境之外更改我的存储库 我正在使用 Gatsby GitHub Netlify 设置
  • 软键盘覆盖 PopupWindow 中的 EditText

    我整理了一个简单的测试项目 它显示一个包含 EditText 的 PopupWindow 在 Android 2 2 上 当我点击 EditText 时 会显示软键盘 正如我所期望的那样 但是 软键盘覆盖了 EditText 并且我无法平移
  • APC缓存碎片问题

    我在 CentOS 服务器 5 上运行 APC php 缓存 每天 13 000 次访问 运行 php 5 3 3 APC 3 1 4 和 4Gb RAM 在过去的几周里 我经历了很多 unable to allocate memory f
  • 响应图表不受控制地增长

    我有一个 vue 组件 它实现了 vue chartjs 的 Horizo ntalBar 组件 我将其渲染为 bootstrap vue 表中的单元格 我的愿望是让图表保持固定的高度 但随着窗口的增大 缩小而水平缩放 当页面首次加载时 图
  • 使用堆栈反转数组

    我正在尝试使用堆栈反转数组 但是 我收到错误arr i stack top 在 Eclipse 中解决它的建议是将其更改为arr i stack pop 或添加演员阵容 还有其他方法吗 或者我犯了一个错误 我看到教程和问题询问如何使用堆栈反
  • 如何在 R 中使用 H2o 从 SQL Server 加载表?

    我尝试使用 h2o 将表加载到 R 中 但出现以下错误 my data lt h2o import sql table my sql conn table username password 错误 意外的 HTTP 状态代码 500 服务器
  • Javascript - innerHTML 不适用于 HTML 选择菜单

    在我的 HTML 页面中 我有 2 个选择菜单 其 ID 为 月 和 日 页面加载时 日 为空 月 有 12 个选项 其值 1 12 对应于一月至十二月 month 有一个 onchange 事件调用此函数 function showOut
  • 属性 KeyValuePair.Value 没有 setter

    我正在使用一个Dictionary
  • Java 中的时区

    我允许我的网络应用程序上的用户根据他们选择的时区安排活动 我想向最终用户提供一份良好的时区列表 然后将其轻松转换为java util TimeZone服务器端的对象 String TimeZone getAvailableIds 是我可以使
  • 从 vs 2017 以编程方式连接到 TFS

    我在用TFS 15 x package Error Microsoft TeamFoundation TeamFoundationServerUnauthorizedException TF30063 您无权访问 https myproje
  • 使用钩子时,React 批量状态更新功能是否有效?

    对于类组件 this setState如果在事件处理程序内部 则调用批处理 但是如果状态在事件处理程序之外更新并使用 会发生什么useState hook function Component const a setA useState a