React学习系列(九):hooks useFetch

389 阅读5分钟

useFetch:轻松从服务器获取数据的 React Hooks

1.useFetch 的定义

useFetch 是 React Hooks 中一个专用于数据获取的成员。它允许你在组件中使用一行代码发起网络请求,然后等待服务器响应。使用 useFetch,你可以轻松管理请求配置、错误处理和数据缓存。

2.useFetch 的优势

  • 简洁明了:  useFetch 的语法非常简单,只需要两个参数:要请求的 URL 和可选的请求选项。
  • 代码可读性高:  useFetch 有助于保持你的代码井井有条,减少代码复杂性和错误的可能性。
  • 支持多种请求方式:  useFetch 支持各种 HTTP 请求方法,如 GET、POST、PUT 和 DELETE。
  • 自定义请求选项:  你可以通过传递请求选项对象来定制请求行为,包括请求头、正文和超时。
  • 自动错误处理:  useFetch 自动处理错误并提供错误信息,使你能够轻松地处理服务器问题。
  • 数据缓存:  useFetch 可以自动缓存数据,避免重复的服务器请求。

3.useFetch 的使用方式

要使用 useFetch,你可以在组件中调用它并传入以下参数:

import { useFetch } from "react"; 
const Example = () => { 
const [data, loading, error] = useFetch("https://example.com/api/data"); if (loading) { return <div>Loading...</div>; } if (error) { return <div>Error: {error.message}</div>; } return <div>{data}</div>; }; export default Example;

返回的值是一个数组,包含三个元素:

  • data:服务器响应的数据
  • loading:指示请求是否仍在进行中
  • error:包含任何错误信息的错误对象(如果请求失败)

4.useFetch 的最佳实践

在使用 useFetch 时,遵循以下最佳实践可以帮助你优化代码:

  • 使用 useEffect 钩子在组件挂载时发起请求。
  • 使用 useCallback 钩子防止不必要的重新渲染。
  • 使用 useReducer 钩子管理复杂的请求状态。

5.useFetch 的常见场景

useFetch 可以用于广泛的场景,包括:

  • 从 API 获取数据
  • 更新服务器数据
  • 删除服务器数据
  • 创建服务器数据

6.自定义useFetch会用到的两个钩子函数

1.useQuery

useQuery是一个在 React(特别是结合 React Query 库)中非常有用的钩子函数。

1. 背景和用途

在现代 Web 应用程序中,从服务器获取数据是一个常见的操作。React Query 是一个数据获取和缓存库,useQuery是 React Query 提供的核心钩子之一。它主要用于在 React 组件中方便地获取、缓存和更新异步数据。例如,当你需要从 API 获取用户列表、产品信息等数据时,useQuery可以帮助你高效地完成这个任务。

2. 基本语法和参数

  • 基本语法:

    • const { data, isLoading, isError, error } = useQuery(queryKey, queryFn);
  • 参数说明:

    • queryKey:这是一个用于唯一标识查询的键。它可以是一个字符串、一个数组(通常包含字符串和可能的动态参数)。例如,如果你要获取用户数据,queryKey可以是["users"],如果要获取特定用户的详细信息,可能是["user", userId],其中userId是一个动态的变量。
    • queryFn:这是一个异步函数,用于获取数据。它通常是一个返回Promise的函数,例如一个fetch请求或者调用一个返回Promise的 API 函数。比如:
    const queryFn = async () => { 
       const response = await fetch("https://api.example.com/data"); 
       return response.json(); 
    };
    

3. 返回值解释

  • data:当查询成功完成时,这个属性包含从服务器获取到的数据。如果查询仍在进行中或者出现错误,它的值将是undefined。例如,如果你获取用户列表成功,data将是一个包含用户对象的数组。
  • isLoading:这是一个布尔值,表示查询是否正在加载。当useQuery首次调用,并且queryFn还没有完成执行时,isLoadingtrue。在数据获取完成或者出现错误后,它将变为false。这对于显示加载指示器(如旋转的加载图标)非常有用。
  • isError:也是一个布尔值,表示查询是否出现错误。如果在执行queryFn过程中出现异常,isError将变为true。这有助于你在组件中处理错误情况,例如显示错误消息。
  • error:当isErrortrue时,error属性包含了错误对象。你可以使用这个对象来获取错误的详细信息,如错误消息、状态码等,以便向用户提供有意义的反馈。

4. 缓存机制

useQuery具有内置的缓存机制。当使用相同的queryKey进行多次查询时,React Query 会首先检查缓存。如果缓存中有可用的数据,并且数据仍然有效(根据配置的缓存时间等因素),它将直接返回缓存中的数据,而不是再次执行queryFn。这大大提高了性能,特别是对于频繁获取相同数据的场景。

5. 与其他 React Query 功能结合使用 useQuery可以与其他 React Query 提供的功能很好地配合。例如,useMutation用于执行数据的修改操作(如创建、更新、删除)。当修改操作完成后,你可以使用useQueryrefetch功能来自动更新缓存中的相关数据。假设你有一个useMutation用于更新用户信息,更新完成后,你可以调用相关useQueryrefetch函数来确保显示的用户数据是最新的。

import React from "react"; 
import { useQuery, useMutation } from "react-query"; 

const updateUser = async (updatedUser) => { 

const response = await fetch("https://api.example.com/users/update", { 
  method: "POST", 
  headers: { "Content-Type": "application/json", }, 
  body: JSON.stringify(updatedUser), }); 
  return response.json(); 
}; 

const getUser = async () => { 
  const response = await fetch("https://api.example.com/users/1"); 
  return response.json(); 
};

const MyComponent = () => { 
const { data: userData, refetch } = useQuery("user", getUser); 
const [updateUserMutation] = useMutation(updateUser); 
const handleUpdate = async () => { 
 await updateUserMutation({...userData, name: "New Name" });   await refetch(); 
}; 

if (!userData) { 
  return <div>Loading...</div>; 
} 

return ( 
<div> 
  <p>User Name: {userData.name}</p> 
  <button onClick={handleUpdate}>Update User</button> 
</div> 
); 
};

在这个例子中,useQuery用于获取用户数据,useMutation用于更新用户数据,更新完成后通过refetch更新useQuery缓存中的用户数据。

参考链接: www.bytezonex.com/archives/ZT…