”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 停止使用 React-Query 中的 useQuery !

停止使用 React-Query 中的 useQuery !

发布于2024-08-22
浏览:682

Stop using useQuery from React-Query !

在任何 Web 应用程序中,管理加载和错误状态至关重要。显示加载状态可以让用户随时了解情况,但从历史上看,手动实施这种管理可能很乏味。

React Query 极大地简化了加载状态和全局状态的处理。事实上,React Query 避免了冗余请求,从而优化了应用程序的性能。

让我们看一个在应用程序中实现加载状态的代码示例。

定义一个钩子来获取用户列表:

export const useUsers = () => {
  const { data, isLoading } = useQuery({
    queryKey: ["users"],
    queryFn: async () => {
      const response = await fetch("https://jsonplaceholder.typicode.com/users");
      await new Promise((resolve) => setTimeout(resolve, 2000));
      return response.json();
    },
  });

  return {
    users: data?.slice(0, 4) || [],
    isLoading,
  };
};

在这里,我们使用 useQuery 获取四个用户。我们添加 2 秒的延迟来说明加载状态。然后我们返回数据和加载状态的布尔值。

在组件方面,我们创建一个名为Example的组件:

const Example = (): JSX.Element => {
  const { users, isLoading } = useUsers();

  if (isLoading) {
    return 
Loading...
; } return (

Users

); };

在此组件中,我们使用钩子来获取用户列表。在渲染视图之前,我们执行带有加载消息的“提前返回”,然后显示标题、按钮和用户。

限制和替代方案

但是,每个网络调用都需要对加载状态进行显式管理。如果代码未分解,视图的某些元素可能正在等待显示,例如标题和操作。

这是避免遮挡视图的替代方法:

import "./App.css";
import UsersList from "./UsersList";
import { useUsers } from "./useUsers";

const Example = (): JSX.Element => {
  const { users, isLoading } = useUsers();

  return (
    

Users

{isLoading ?
Loading...
: }
); };

在这里,我们使用条件渲染而不是“提前返回”。该解决方案可读性较差,并且在复杂组件中更难维护。

理想的解决方案:通用加载组件

最巧妙的解决方案是创建一个组件来渲染我们的加载消息或基于变量的主组件。

type Props = PropsWithChildren;

const LoadingWrapper = ({ children, isLoading }: Props): JSX.Element => {
  if (isLoading) {
    return 
Loading...
; } return {children}>; };

在我们的组件中的用法

const Example = (): JSX.Element => {
  const { users, isLoading } = useUsers();

  return (
    
...
); };

这种分解集中了条件渲染逻辑并统一了加载消息的使用,提供了更清晰、更易于维护的代码。

探索悬念的魔力

但是现在,如果我告诉你我们刚刚创建的这个组件已经内置到 React 中了。更好的是,它很神奇!不再需要手动管理 isLoading 状态!

如何?

有了 React 的 Suspense(React 版本 >= 16.6),一切都变得更简单、更清晰。 Suspense 允许您显式向 React 声明组件正在等待异步数据,React 会为我们管理一切。

实施 useSuspenseQuery

让我们使用useSuspenseQuery来自动管理加载状态。操作方法如下:

挂钩获取用户

export const useUsersSuspense = () => {
  const { data } = useSuspenseQuery(
    ...
  );

  return {
    users: data?.slice(0, 4) || [],
    // Without the isLoading
  };
};

在带有 Suspense 的组件中的使用

现在,让我们更新示例组件以使用 Suspense:

const UsersComponent = (): JSX.Element => {
  const { users } = useUsersSuspense();

  return ;
};

const Example = (): JSX.Element => {
  return (
    

Users

Loading...
}> ); };

悬念的优点

通过 Suspense,我们将加载状态的管理集中在一处,使代码更具可读性和可维护性。只要数据不可用,Suspense 回退就会自动显示,无需手动管理 isLoading 状态。

此外,Suspense 鼓励开发团队分解他们的代码。通过使用标准化的加载组件和异步状态处理程序,开发人员可以创建可重用且一致的模块,从而长期提高代码质量和可维护性。

结论

使用 Suspense 和 useSuspenseQuery 彻底改变了 React 应用程序中加载状态的管理。这种方法不仅简化了代码,还通过确保平滑一致的渲染来增强用户体验。从 useQuery 过渡到 useSuspenseQuery 是更清洁、更高效的应用程序的自然演变。

此外,集成 Suspense 鼓励开发团队分解他们的代码。总而言之,采用 Suspense 和 useSuspenseQuery 不仅仅是技术上的改进,也是迈向更健康、更有效的开发实践的一步。

我的时事通讯:D

版本声明 本文转载于:https://dev.to/rouretl/stop-using-usequery-from-react-query--1o9?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-07-14
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-07-14
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-07-14
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-07-14
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-07-14
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-07-14
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-07-14
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-07-14
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-07-14
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-07-14
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-07-14
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-07-14
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-07-14
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-07-14
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-07-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3