在react-query中使用(isLoading或isFetching)的原因

2024-05-03

我是一个使用react的用户。 我在使用react-query时没有很好地使用isloading函数。 在ui方面,我认为正在加载用于向用户显示加载屏幕。 我认为我不必显示加载,因为数据获取速度很快。

但突然,我想到了这个想法。

如果你把 props 交给子组件,在数据通过 undefined 并获取到数据后,你经常渲染获取到的数据,所以我认为这可能是因为优化渲染的原因,还是有其他原因?


我认为你的问题值得更详细的回答,因为isFetching经常被忽视。

正在加载

正如您发现的那样,查询的获取速度足够快,您可能会觉得不需要检查isLoading。在许多示例中,您会看到类似这样的内容:

  const { data, isLoading } = useQuery(...);

  if (isLoading)
    return <div>Loading...</div>;

  return <DataTable data={data} />;

当第一次获取数据时(UseQueryResult.status === "loading")你显示一个加载指示器某种形式,当数据可用时,您可以随意使用它。

延迟加载指示器

如果查询加载速度很快,那么您将短暂地看到“正在加载...”(或旋转窗口),这不是一个好的用户界面。对于非常短的延迟,最好什么也不显示:您可以使用动画来实现(或设置计时器以使微调器可见),只要将其嵌入到您的<LoadingIndicator />成分。我发现 100/150 毫秒的延迟是一个很好的折衷方案(对我来说)。如果您有兴趣,可以通过研究来确定最合适的值。

Errors

您可能还想处理错误,有isError为此(或者你可以简单地使用status对于一切)。稍微复杂一点的典型实现如下所示:

const { status, data, error, refresh } = useQuery(...);

if (status === "loading")
  return <LoadingIndicator />;

if (status === "error" />
  return <Error error={error} onRetry={refresh} />

return <DataTable data={data} onRefresh={refresh} />;

注意我们是如何介绍的refresh(),当我们调用它时,我们会导致isFetching to be true(初始获取不会发生这种情况)。

正在获取

正如我们所看到的,isFetching is true当我们已经有一个值(或尝试第一次获取)并且我们再次获取相同的数据时。当我们manually触发刷新,但也会在react-query重新加载缓存数据时触发刷新(在本例中status === "success").

这在少数情况下非常重要:

  • 我们可能不想在刷新表格时显示加载指示器。
  • When isRefresh is true and data !== undefined我们可能想简单地禁用编辑(如果支持)而不显示任何加载指示器(或使用不同的更微妙的指示器)。

我们可能还想使用微妙的视觉线索(例如使文本变暗)显示陈旧数据,如果没有任何变化,那么当有新数据可用时,我们将有最小的闪烁和布局变化。也可以看看isPreviousData.

Reuse

正如您所看到的,您可能会在一个简单的查询周围有很多样板代码。我喜欢做的是构建一个可重用的组件:

const query = useQuery(...);

return (
  <Query query={query}>
    ({ data }) => <DataTable data={data} />
  </Query>
);

无障碍

不要忘记包括aria-live and aria-busy属性,外部容器(数据和加载/错误指示器的父容器)可以这样定义:

<section aria-live="polite" aria-busy={isLoading || isFetching}>

确切的实现取决于您的具体情况,但不要忘记为加载指示器也包含 ARIA 属性(特别是在使用动画/图标时):

<div role="alert" aria-live="polite" aria-label="Loading" />

对于错误banner你可以包括role="alert"(在这种情况下默认aria-live="assertive"所暗示的"alert"角色合适)。

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

在react-query中使用(isLoading或isFetching)的原因 的相关文章

随机推荐

  • PyParsing:是否可以全局抑制所有文字?

    我有一个简单的数据集 可以使用如下行进行解析 R1 a 30 to R2 b 30 metric 30 我需要的唯一数据如下 R1 a 30 R2 192 168 0 2 30 30 我可以使用 pyparsing 轻松解析所有这些内容 但
  • pg_resetxlog 是做什么的?它是如何运作的?

    我查看了 postgres 文档 并给出了以下概要 pg resetxlog f n ooid x xid e xid epoch m mxid O mxoff l timelineid fileid seg datadir 但文档中没有任
  • 如何在Python中从JSON中删除括号?

    我在用json dumps将字典列表加载到 JSON 对象中 我的输出类似于 MetaData SRData ListOfLa311DeadAnimalRemoval DeadAnimalRemoval DACItemCount 0 DAC
  • 如何在 File 类中提供相对路径来上传任何文件? [复制]

    这个问题在这里已经有答案了 我正在上传一个文件 我想为其提供相对路径 因为该程序应该在 Linux 和 Windows 环境中运行 这就是我用来上传的 realPath getServletContext getRealPath files
  • 首次执行后 CPU 霍夫曼压缩速度更快?

    我最近用 C 构建了 Huffman 编码的 CPU 实现 我还在 CUDA 中构建了一个 GPU 版本来比较时间 但在测试 CPU 时间时遇到了一个问题 当通过压缩大文件 例如几乎包含字母表中的每个字母和各种其他 ascii 字符的 97
  • 如何链接到以数组作为参数的操作(RedirectToAction 和/或 ActionLink)?

    我有一个如下定义的操作 public ActionResult Foo int bar 像这样的 URL 将按预期工作 Controller Foo bar 1 bar 3 bar 5 我有另一个操作可以完成一些工作 然后重定向到Foo上面
  • 如何在 python f 字符串中动态填充数字?

    我有一个像这样的 f 字符串 f foo i 03d 这会为我读入的文件生成一个文件名 问题是有时有数百个文件 因此文件的名称类似于 foo 001 foo 002 等 但其他时候有数千个 因此文件的名称为 foo 001 foo 002
  • 如何减少顶点图中折线图的线条粗细

    我在角度项目中使用 Apex 图表 我在那里实现了时间序列图表 但无法减少折线图中的 线条粗细 这是我的配置 public initChartData void this series this response data data thi
  • 进程终止时释放资源

    当进程被任务管理器等进程终止时 如何释放资源 有没有办法在进程关闭之前调用函数 如果您的进程被终止 您实际上无能为力 根据定义 杀死一个进程就是杀死它 该进程没有机会运行任何代码 这很大程度上是 设计使然 想象一下 您可以注册一个例程 当您
  • Python 函数前的星号[重复]

    这个问题在这里已经有答案了 我正在关注这个教程 http www pyimagesearch com 2015 04 20 sorting contours using python and opencv comment 405768 ht
  • 检测 iPhone 上的长按

    我正在开发一个 iPhone 应用程序 它要求我检查是否已点击按钮并按住 6 秒 然后触发一个播放某种声音的动作 我应该如何检测这个 6 秒的点击 另一方面 用户还可以持续点击按钮 6 秒 然后会触发相同的操作 我应该如何处理多次点击 我怎
  • 如何按层次结构对文件路径名进行排序?

    我想按层次结构对文件名进行排序 假设我有以下文件夹列表 D Movies Hollywood Comedy adultcomedy D Movies Hollywood Comedy horrorcomedy D Movies Hollyw
  • 将图像从 Android 上传到 GCS

    我正在尝试将图像从 Android 直接上传到 Google 云存储 但API似乎不起作用 他们有一些与 App 引擎相关的 Java 示例 我没有看到任何被证明可以在 Android 上运行的示例 在 Android 上 我尝试使用 js
  • 从 SpringBoot 项目中的属性文件获取 Maven basedir

    我继承的Maven项目有一些JUnits中使用的资源文件 这些文件在属性文件中被称为绝对路径 我们假设 Maven 项目位于myproject 其中主要pom xml居住 A config properties文件有 keystore fi
  • 如何检测媒体是否已插入可移动驱动器/读卡器

    我有一个读卡器 未插入记忆棒 当我插入计算机时 它在 我的电脑 中显示一个空驱动器 是否有可能知道驱动器是否有媒体 抱歉我不知道如何称呼它 或没有 我找到的建议MSalters to use IOCTL STORAGE CHECK VERI
  • 如何将值从 javascript 传递到 php 文件

    我通过以下方式获取价值JQuery像这样的东西 var query popURL split var dim query 1 split var popWidth dim 0 split 1 Gets the first query str
  • 使用 UIActivityViewController 分享视频

    我正在尝试使用默认的苹果共享屏幕将视频分享到 Twitter 和 Facebook 等 我已经让它与图像一起使用 但我不知道如何更改它以与视频一起使用 提前致谢 这是我用来分享照片的代码 IBAction shareButtonPresse
  • WIX MSI 软件包卸载

    我正在使用 WIX 作为安装程序包 当我通过双击原始 msi 包卸载该包时 一切都很好 当我从控制面板卸载时 它会给我一个最小的用户界面卸载 我已在 MSI 中写入一个自定义操作 询问用户是否要卸载某些数据库等 最小 UI 卸载时不会发生这
  • 在 phpstorm 中使用远程服务器 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前使用 Komodo 并直接在远程服务器上工作 我刚刚发现了 phpstorm 我想开始尝试一下 我的问题是 如何像科莫多那样在远
  • 在react-query中使用(isLoading或isFetching)的原因

    我是一个使用react的用户 我在使用react query时没有很好地使用isloading函数 在ui方面 我认为正在加载用于向用户显示加载屏幕 我认为我不必显示加载 因为数据获取速度很快 但突然 我想到了这个想法 如果你把 props