React Query:高效管理API请求与缓存

2024-06-02 16:36

本文主要是介绍React Query:高效管理API请求与缓存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

React Query 是一个强大的状态管理库,专门用于处理数据获取、缓存和更新,尤其适合与 API 交互。它提供了许多高级特性,如自动缓存、离线状态管理、数据过期和重新获取等。

安装:

   npm install react-query

导入并配置 React Query:

在你的应用中,你需要导入 useQuery Hook 并设置配置对象。

   import { useQuery } from 'react-query';const queryClient = new QueryClient();

可以通过 QueryClientProviderqueryClient 包裹在你的根组件周围,以便在整个应用中使用。

   import { QueryClient, QueryClientProvider } from 'react-query';const queryClient = new QueryClient();function App() {return (<QueryClientProvider client={queryClient}>{/* Your application */}</QueryClientProvider>);}

使用 useQuery Hook:

使用 useQuery 来发起 API 请求并管理响应数据。

   function MyComponent() {const { data, status, error } = useQuery('myQueryKey', () => fetch('https://api.example.com/data'));if (status === 'loading') return 'Loading...';if (error) return 'An error occurred.';return <div>{data}</div>;}

这里,myQueryKey 是查询的唯一标识符,fetch('https://api.example.com/data') 是实际的 API 调用。

配置选项:

useQuery 接受一个配置对象,可以设置缓存策略、重试逻辑等。

   const { data } = useQuery('myQueryKey',() => fetch('https://api.example.com/data'),{staleTime: 60000, // 数据在多久后被视为过期并重新获取retry: 3, // 重试次数refetchOnWindowFocus: false, // 窗口聚焦时是否重新获取数据});

手动操作:

你可以手动触发数据的重新获取、取消或设置为错误状态。

   const { refetch, reset, isFetching } = useQuery('myQueryKey', fetchData);// 重新获取数据refetch();// 清除查询状态和数据reset();// 检查是否正在获取数据if (isFetching) console.log('Data is being fetched');

订阅更新:

你可以通过 useQuery 的返回值订阅查询状态变化。

   const { status, data, error } = useQuery('myQueryKey', fetchData);useEffect(() => {if (status === 'success') console.log('Data updated:', data);}, [status, data]);

分页:

React Query 支持分页,你可以通过 useInfiniteQuery Hook 实现无限滚动。

   import { useInfiniteQuery } from 'react-query';function MyInfiniteList() {const { data, isFetching, hasNextPage, fetchNextPage } = useInfiniteQuery('myInfiniteQuery',async ({ pageParam = 1 }) => {const response = await fetch(`https://api.example.com/data?page=${pageParam}`);return response.json();},{getNextPageParam: (lastPage) => lastPage.nextPageToken || false,});return (<div>{data.pages.map((page, index) => (<ul key={index}>{page.items.map(item => <li key={item.id}>{item.title}</li>)}</ul>))}{hasNextPage && !isFetching && (<button onClick={fetchNextPage}>Load More</button>)}</div>);}

这里,getNextPageParam 函数用于从上一页的响应中提取下一页的标识符。

缓存更新:

当 API 数据更新时,React Query 可以自动更新缓存中的数据,例如在使用 Mutation 时。

   import { useMutation } from 'react-query';const [updateItem] = useMutation(async (updatedItem) => {await fetch('https://api.example.com/items/' + updatedItem.id, {method: 'PUT',body: JSON.stringify(updatedItem),});});// 更新数据并自动刷新相关查询updateItem.mutate(updatedItem);

错误处理:

React Query 提供了内置的错误处理机制,你可以通过 error 属性来捕获错误。

   const { data, error } = useQuery('myQueryKey', fetchData);if (error) return <div>Error: {error.message}</div>;

查询缓存清理:

你可以根据需要清理特定查询的缓存。

    queryClient.removeQueries('myQueryKey'); // 清理所有匹配的查询queryClient.cancelQueries('myQueryKey'); // 取消匹配的查询

自定义中间件:

通过自定义中间件,你可以扩展 React Query 的功能,例如添加日志、性能监控等。

    import { QueryClient, QueryClientProvider } from 'react-query';const queryClient = new QueryClient({queryCache: new QueryCache({middlewares: [// 自定义中间件myCustomMiddleware,],}),});

预取数据(Prefetching):

React Query 允许你在组件渲染之前预取数据,提升用户体验。

    import { usePrefetch } from 'react-query';function MyComponent() {const prefetchData = usePrefetch('myQueryKey');useEffect(() => {// 在组件挂载时预取数据prefetchData();}, []);// ...其他逻辑}

乐观更新(Optimistic Updates):

在用户触发变更操作时立即更新 UI,然后再等待服务器确认,这能提供即时反馈,提升交互体验。

    import { useMutation } from 'react-query';const [updateTodo, { optimisticData }] = useMutation(updateTodoMutation, {onMutate: (newTodo) => {// 乐观地更新客户端缓存queryClient.setQueryData(['todos', newTodo.id], newTodo);return { previousTodo: queryClient.getQueryData(['todos', newTodo.id]) };},onError: (err, newTodo, context) => {// 如果发生错误,回滚到之前的值queryClient.setQueryData(['todos', newTodo.id], context.previousTodo);},onSettled: () => {// 查询已解决时,可以做清理工作queryClient.invalidateQueries('todos');},});function handleUpdate(todo) {updateTodo({ ...todo, completed: !todo.completed });}

并发控制:

有时,你需要控制同时运行的查询数量,特别是当调用多个 API 或有大量并发请求时。

    const { data } = useQuery(['concurrentQuery', { limit: 10 }], fetchItems, {staleTime: Infinity, // 防止数据过期自动重试refetchInterval: false, // 关闭自动轮询refetchOnWindowFocus: false, // 不在窗口聚焦时自动重试retry: false, // 失败时不重试useErrorBoundary: true, // 错误边界,避免组件树崩溃concurrency: 2, // 最大并发数});

依赖注入:

如果你的查询逻辑依赖于外部参数,可以通过 useQueries 来并行执行多个查询,每个查询可以有不同的配置。

    import { useQueries } from 'react-query';function MyComponent({ ids }) {const queries = useQueries(ids.map(id => ({queryKey: ['item', id],queryFn: () => fetchItem(id),})));return (<div>{queries.map(query => (<div key={query.queryKey[1]}>{query.isLoading ? 'Loading...' : query.data?.title}</div>))}</div>);}

React Query 的设计考虑到了现代 Web 应用的各种复杂场景,通过上述功能,开发者可以轻松实现数据管理和状态同步,同时保持应用的高性能和良好的用户体验。

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

这篇关于React Query:高效管理API请求与缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024499

相关文章

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

vue, 左右布局宽,可拖动改变

1:建立一个draggableMixin.js  混入的方式使用 2:代码如下draggableMixin.js  export default {data() {return {leftWidth: 330,isDragging: false,startX: 0,startWidth: 0,};},methods: {startDragging(e) {this.isDragging = tr

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

js+css二级导航

效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页: