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

停止使用 React-Query 中的 useQuery !

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

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]删除
最新教程 更多>
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    编程 发布于2025-05-06
  • Go语言如何动态发现导出包类型?
    Go语言如何动态发现导出包类型?
    与反射软件包中的有限类型的发现能力相反,本文探索了替代方法,探索了在Runruntime。go import( “ FMT” “去/进口商” ) func main(){ pkg,err:= incorter.default()。导入(“ time”) 如果err...
    编程 发布于2025-05-06
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-05-06
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-05-06
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解决此问题,必须确保提供给HAAR CASCADE XML文件的路径有效。在提供的代码片段中,级联分类器装有硬编码路径,这可能对您的系统不准确。相反,OPENCV提...
    编程 发布于2025-05-06
  • 在Oracle SQL中如何提取下划线前的子字符串?
    在Oracle SQL中如何提取下划线前的子字符串?
    [ 在oracle sql 解决方案: Explanation:SUBSTR function extracts a substring starting from the specified position (0) and continuing for a specified length.IN...
    编程 发布于2025-05-06
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-05-06
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-05-06
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-05-06
  • 如何从2D数组中提取元素?使用另一数组的索引
    如何从2D数组中提取元素?使用另一数组的索引
    Using NumPy Array as Indices for the 2nd Dimension of Another ArrayTo extract specific elements from a 2D array based on indices provided by a second ...
    编程 发布于2025-05-06
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-05-06
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-05-06
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-05-06
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-05-06
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-05-06

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

Copyright© 2022 湘ICP备2022001581号-3