使用react-hooks更新状态时执行异步代码

2023-11-23

我有类似的东西:

const [loading, setLoading] = useState(false);

...

setLoading(true);
doSomething(); // <--- when here, loading is still false. 

设置状态仍然是异步的,那么等待这个的最佳方法是什么setLoading()打电话结束?

The setLoading()似乎不接受回调setState()习惯了。

一个例子

基于类的

getNextPage = () => {
    // This will scroll back to the top, and also trigger the prefetch for the next page on the way up.
    goToTop();

    if (this.state.pagesSeen.includes(this.state.page + 1)) {
      return this.setState({
        page: this.state.page + 1,
      });
    }

    if (this.state.prefetchedOrders) {
      const allOrders = this.state.orders.concat(this.state.prefetchedOrders);
      return this.setState({
        orders: allOrders,
        page: this.state.page + 1,
        pagesSeen: [...this.state.pagesSeen, this.state.page + 1],
        prefetchedOrders: null,
      });
    }

    this.setState(
      {
        isLoading: true,
      },
      () => {
        getOrders({
          page: this.state.page + 1,
          query: this.state.query,
          held: this.state.holdMode,
          statuses: filterMap[this.state.filterBy],
        })
          .then((o) => {
            const { orders } = o.data;
            const allOrders = this.state.orders.concat(orders);
            this.setState({
              orders: allOrders,
              isLoading: false,
              page: this.state.page + 1,
              pagesSeen: [...this.state.pagesSeen, this.state.page + 1],
              // Just in case we're in the middle of a prefetch.
              prefetchedOrders: null,
            });
          })
          .catch(e => console.error(e.message));
      },
    );
  };

转换为基于函数的

  const getNextPage = () => {
    // This will scroll back to the top, and also trigger the prefetch for the next page on the way up.
    goToTop();

    if (pagesSeen.includes(page + 1)) {
      return setPage(page + 1);
    }

    if (prefetchedOrders) {
      const allOrders = orders.concat(prefetchedOrders);
      setOrders(allOrders);
      setPage(page + 1);
      setPagesSeen([...pagesSeen, page + 1]);
      setPrefetchedOrders(null);
      return;
    }

    setIsLoading(true);

    getOrders({
      page: page + 1,
      query: localQuery,
      held: localHoldMode,
      statuses: filterMap[filterBy],
    })
      .then((o) => {
        const { orders: fetchedOrders } = o.data;
        const allOrders = orders.concat(fetchedOrders);

        setOrders(allOrders);
        setPage(page + 1);
        setPagesSeen([...pagesSeen, page + 1]);
        setPrefetchedOrders(null);
        setIsLoading(false);
      })
      .catch(e => console.error(e.message));
  };

在上面,我们希望顺序运行每个 setWhatever 调用。这是否意味着我们需要设置许多不同的 useEffect 挂钩来复制此行为?


useStatesetter 不会像 React 类组件中的 setState 那样在状态更新完成后提供回调。为了复制相同的行为,您可以使用类似的模式,例如componentDidUpdateReact 类组件中的生命周期方法useEffect使用钩子

useEffecthooks 将第二个参数作为一个值数组,React 需要在渲染周期完成后监视其变化。

const [loading, setLoading] = useState(false);

...

useEffect(() => {
    doSomething(); // This is be executed when `loading` state changes
}, [loading])
setLoading(true);

EDIT

Unlike setState,更新程序useStatehook 没有回调,但您始终可以使用useEffect复制上述行为。但是您需要确定负载变化

代码的功能方法如下所示

function usePrevious(value) {
  const ref = useRef();
  useEffect(() => {
    ref.current = value;
  });
  return ref.current;
}

const prevLoading = usePrevious(isLoading);

useEffect(() => {
   if (!prevLoading && isLoading) {
       getOrders({
          page: page + 1,
          query: localQuery,
          held: localHoldMode,
          statuses: filterMap[filterBy],
      })
      .then((o) => {
        const { orders: fetchedOrders } = o.data;
        const allOrders = orders.concat(fetchedOrders);

        setOrders(allOrders);
        setPage(page + 1);
        setPagesSeen([...pagesSeen, page + 1]);
        setPrefetchedOrders(null);
        setIsLoading(false);
      })
      .catch(e => console.error(e.message));
   }
}, [isLoading, preFetchedOrders, orders, page, pagesSeen]);

const getNextPage = () => {
    // This will scroll back to the top, and also trigger the prefetch for the next page on the way up.
    goToTop();

    if (pagesSeen.includes(page + 1)) {
      return setPage(page + 1);
    }

    if (prefetchedOrders) {
      const allOrders = orders.concat(prefetchedOrders);
      setOrders(allOrders);
      setPage(page + 1);
      setPagesSeen([...pagesSeen, page + 1]);
      setPrefetchedOrders(null);
      return;
    }

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

使用react-hooks更新状态时执行异步代码 的相关文章

  • JavaScript 字符串中的脚本标签[重复]

    这个问题在这里已经有答案了 我遇到一个问题 即 JavaScript 中带引号的字符串内有结束脚本标记 并且它正在杀死脚本 我认为这不是预期的行为 可以在这里看到这样的示例 http jsbin com oqepe edit http js
  • JAVASCRIPT - 为什么这个对象没有改变?

    function myFunc theObject theObject make Ford model Focus year 2006 var mycar make Honda model Accord year 1998 var x my
  • Javascript 对象属性名称

    在 C 中 可以将对象属性的名称作为字符串值获取 名称 对象 Property gt myProperty 这可以在 Javascript Typescript 中完成吗 Object Keys 是我找到的唯一东西 但它给了我所有的键 示例
  • 从选择 onChange 调用 javascript 函数 [重复]

    这个问题在这里已经有答案了 所以我有一个简单的 HTML 选择框和一个 javascript 警报功能 我希望选择框有一个 onchange 事件来调用 javascript 警报函数 这是我到目前为止所拥有的 HTML div Type
  • Angular UI 路由器嵌套视图问题

    我在理解 Angular UI Router 嵌套视图的工作原理时遇到了一些问题 我的 stateProvider 看起来像这样 stateProvider state login url login views main template
  • 更新存储在 chrome 扩展本地存储中的对象

    我正在开发一个 chrome 扩展 我将存储服务器发送的对象 例如 我将收到 命令 id 1 类型 A 大小 B 优先级 C 如果我有一个数据库 我会将其作为表中的一行插入commands 使用 chrome storage 我将这些对象的
  • 使用 jQuery inputmask 插件范围 0-100

    如何创建 0 到 100 范围内的掩码 document ready function masked inputmask 您可以使用jquery inputmask regex extensions js为了那个原因 你可以找到带有所有扩展
  • 我可以在 GWT 中使用第三方 Javascript 库吗

    例如穆工具 用 js 编码对我来说很舒服 但显然不适合所有人 你当然可以 最好的事情就是给自己写一些好看的JavaScript 覆盖类型 http code google com webtoolkit doc latest DevGuide
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • EmberJS:对象作为查询参数来刷新模型

    我遵循了查询参数指南 http guides emberjs com v1 11 0 routing query params http guides emberjs com v1 11 0 routing query params 而且效
  • 如何通过setTimeout函数定期打印数字?

    var i 0 function counter for i i lt 100 i setTimeout gt console log i 2000 counter 我想以 2 秒的间隔打印 i 但它立即打印 每次打印调用只需要几微秒 为什
  • 如何在 JSX 中使用 switch case:ReactJS

    我的反应应用程序中导入了四个组件 我如何有条件地渲染组件之一 基于道具 这就是我想做的
  • Firefox Addon 中的 JQuery 导致多个警告

    我在 Firefox 插件中使用 jquery 但我不断收到大量警告消息 如下所示 anonymous function does not always return a value System JS WARNING resource g
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • ES6 模块范围

    我有代码 lib js var a a export var b b main js console log a a variable is not available in a global scope import b from lib
  • node.js 模块/导出系统:是否可以将模块导出为函数

    我想在 Dispatch js 中做这样的事情 function handle msg exports handle 这在调用index js中 var dispatch require Dispatch dispatch data 有任何
  • Svelte 条件元素类报告为语法错误

    我正在做一个if块每if 块的精简指南 https svelte technology guide if blocks 这看起来很简单 但 Svelte 认为这是一个语法错误 svelte plugin ParseError Unexpec
  • 为什么 call 比 apply 快那么多?

    我想知道是否有人知道why call比apply 在 Chrome 中 速度大约快 4 倍 在 Firefox 中快 30 倍 我什至可以制作自定义原型 apply2 在大多数情况下 运行速度是apply 这个想法取自角度 Function
  • 轮播滑动(未滑动)事件上的火灾事件,Bootstrap 3

    Bootstrap 2 似乎可以很好地处理幻灯片事件 请参阅这个问题 https stackoverflow com questions 9651466 how to attach slide slid events to the boot
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行

随机推荐

  • 如何从 SqlDataReader 解析 Nullable

    DateTime TryParse 方法采用 DateTime 作为参数 而不是 DateTime 现在我有以下代码 if DateTime TryParse reader Placed ToString out placed throw
  • 在 Windows Kafka 上删除主题时出现 AccessDeniedException

    我刚刚在我的 Windows 机器上安装了 Kafka 来自 Confluence Platform 我启动了 Zookeeper 和 Kafka 并创建主题 生产和消费它们的工作 然而 一旦我删除一个主题 Kafka 就会崩溃 如下所示
  • 如何避免 Selenium 中的 StaleElementReferenceException - Python

    我陷入了编写 Python Selenium 脚本的困境 似乎无法令人满意地解决我收到的这个 StaleElementReferenceException 我已加载页面并单击一个按钮 该按钮将打开一个表单 允许用户向订单添加新的信用卡 此时
  • 如何用java转换巨大的xml文件?

    正如标题所说 我有一个巨大的 xml 文件 GB
  • Angularjs 后接收钩子或类似的?

    有没有一种方法可以在每次从服务器返回响应后调用一个函数 而无需在回调中显式调用它 主要目的是我确实有一个通用错误处理程序服务 我在每个请求的回调中调用它 并且我想在某处指定它并且它应该被自动调用 我给了Gloopy一个 1的解决方案 但是
  • 如何冻结无法冻结的可冻结对象

    在我的场景中 我想先冻结不变的 BitmapCacheBrush 然后再在后台任务中渲染它 不幸的是 我收到错误 此 Freezable 无法冻结 是否有任何解决方法或黑客方法冻结也不可冻结的对象 也许可以通过反射设置正确的属性来达到这个目
  • jQuery UI 日期选择器不会显示 - 包含完整代码

    我在显示 jQuery 日期选择器时遇到问题 如下所示 http jqueryui com demos datepicker 我相信我下载了所有正确的文件 但可以肯定的是 我从头开始并破解了演示网站 不是全部 而是我认为重要的部分 结果是没
  • 将 Bitbucket 部署到 Azure 网站:添加私有 nuget 包服务器

    我已经在 Azure 上建立了一个网站 通过 Bitbucket 存储库进行部署 当尝试安装存储在私有 nuget 服务器 而不是 nuget org 上 的 nuget 包时 该过程会失败 有没有办法指定从何处还原 nuget 包 以便
  • 如果活动崩溃,如何清除通知?

    在我的应用程序中 我正在创建一个带有 FLAG ONGOING EVENT 标志设置的通知 Notification notification new Notification iconId text System currentTimeM
  • 在某些代理关闭后如何更改主题领导者或删除分区?

    我们有一个带有 4 个代理的 kafka 集群 以及一些具有副本因子 1 和 10 分区的主题 某一时刻 我们的 4 台服务器中的 2 台与 kafka 集群发生故障 现在我们有 2 个具有相同主题的经纪人 当我运行命令时 kafka to
  • 将 Mercurial 变更集作为版本信息注入 C 可执行文件中

    我希望我正在开发的项目的可执行文件能够记录最新的 Mercurial 变更集 以便当用户抱怨错误行为时 我可以跟踪他们正在使用的版本 我的一些可执行文件是 Python 的 其他是 C 编译的 有没有办法自动执行此操作 或者您能给我指出一些
  • Python numpy数据指针地址变化无需修改

    EDIT 经过一番摆弄后 到目前为止我已经隔离了以下状态 A 1D array gives two直接输入变量时的地址不同 并且仅one使用时print A 2D array or matrix gives three直接输入变量时的不同地
  • 限制 UISlider 滑动超过某个点

    我们假设 a 有一个UISlider我为其设置了一定的值 然后 滑块手柄会按预期移动到该值 现在我想让用户来回滑动滑块的手柄 但不设置UISlider比我以编程方式分配给它的要少 例如我有一个UISlider最小值为 0 最大值为 100
  • 我可以保护我的 CRON 脚本免受远程用户的攻击吗?

    我目前正在开发一个涉及使用 CRON 作业的新项目 CRON 脚本基本上运行 SQL 查询 将数据生成到文件中 然后通过 FTP 将该文件发送到另一台服务器 该脚本位于实时网站 www website com sendOrders php
  • Stream.Copy 是否通过管道传输?

    假设我正在编写一个tcp代理代码 我正在从传入流中读取并写入输出流 我知道 Stream Copy 使用缓冲区 但我的问题是 Stream Copy 方法是否在从输入流获取下一个块的同时写入输出流 还是像 从输入读取块 将块写入输出 从输入
  • 泽西岛 (REST) 子资源 CDI

    我正在开发一个企业项目 该项目有一个 EJB 模块和一个在 GlassFish v3 1 Weld v1 1 和 Jersey 上运行的 Web 项目 在EJB中我定义了一个实体类Manufacturer并生成了一个会话外观Manufact
  • 计算 yii2 中表中的所有记录,无需使用 where 子句

    我想计算表中的所有记录而不指定任何条件 现在 我正在这样做 result cms Cms find gt where gt count 它会给我结果 但我不想使用where clause 那么如何统计所有记录而不需要where 子句 谢谢
  • 在 PHP 中的匿名函数中访问对象的私有/受保护属性

    我正在尝试通过匿名函数转储对象私有属性的元素 当然我可以通过许多其他方式实现这一点 但这突出了一个我无法立即解决的 PHP 难题 除了 foo this 并使用 foo 但这不会给我私人的东西 所以 建议 示例代码 class MyClas
  • 正则表达式:比较两个字符串以查找头韵和谐音

    是否可以比较两个字符串来找到头韵和谐音 我主要使用 javascript 或 php 我不确定正则表达式是否是构建强大的比较工具的最佳方法 简单的正则表达式可能是更大解决方案的一部分 该解决方案使用更复杂的算法进行非精确匹配 英语有多种现成
  • 使用react-hooks更新状态时执行异步代码

    我有类似的东西 const loading setLoading useState false setLoading true doSomething lt when here loading is still false 设置状态仍然是异