当前位置: 首页 > news >正文

前端使用 React Query 管理“服务器状态”

目录

  • 一、安装注册 react-query
  • 二、使用 react-query
    • 1、定义获取数据的查询函数 fetchTodos
    • 2、使用 useQuery 获取服务器状态
    • 3、新增数据(useMutation + 自动刷新列表)
    • 4、删除数据(useMutation + 乐观更新)
    • 5、组件组合
  • 三、React Query 能做什么?不能做什么?

一、安装注册 react-query

首先要安装 @tanstack/react-query:

npm install @tanstack/react-query

然后在入口文件中必须加 QueryClientProvider:

// main.tsx / index.tsx
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import App from './App';const queryClient = new QueryClient();export default function Root() {return (<QueryClientProvider client={queryClient}><App /></QueryClientProvider>);
}

二、使用 react-query

使用的 React Query 管理“服务器状态”的步骤:

  • 获取数据(useQuery)
  • 创建数据(useMutation)
  • 更新与删除
  • 缓存、重新请求、乐观更新
  • 实战项目文件结构

【举个例子】:
假设有一个服务器 API /api/todos。现在需要你实现以下需求:
①、获取 Todo 列表
②、新增 Todo
③、删除 Todo
④、自动刷新、缓存、错误处理

1、定义获取数据的查询函数 fetchTodos

// api/todoApi.ts
export const fetchTodos = async () => {const res = await fetch('/api/todos');if (!res.ok) throw new Error('Failed to fetch todos');return res.json();
};export const addTodo = async (title: string) => {const res = await fetch('/api/todos', {method: 'POST',body: JSON.stringify({ title }),headers: { 'Content-Type': 'application/json' }});if (!res.ok) throw new Error('Failed to add todo');return res.json();
};export const deleteTodo = async (id: number) => {const res = await fetch(`/api/todos/${id}`, {method: 'DELETE'});if (!res.ok) throw new Error('Failed to delete todo');return res.json();
};

2、使用 useQuery 获取服务器状态

import { useQuery } from '@tanstack/react-query';
import { fetchTodos } from './api/todoApi';export function TodoList() {const { data, isLoading, error } = useQuery({queryKey: ['todos'],      // 缓存 key(全局唯一)queryFn: fetchTodos,      // 请求函数staleTime: 5000,          // 5 秒内不重新请求refetchOnWindowFocus: false, // 切回窗口不重新请求});if (isLoading) return <div>加载中...</div>;if (error) return <div>加载失败</div>;return (<ul>{data.map(todo => (<li key={todo.id}>{todo.title}</li>))}</ul>);
}

3、新增数据(useMutation + 自动刷新列表)

import { useMutation, useQueryClient } from '@tanstack/react-query';
import { addTodo } from './api/todoApi';export function AddTodo() {const queryClient = useQueryClient();const mutation = useMutation({mutationFn: (title: string) => addTodo(title),onSuccess() {// 手动刷新 todos 列表queryClient.invalidateQueries(['todos']);},});const handleAdd = () => {mutation.mutate('新的任务');};return (<button onClick={handleAdd} disabled={mutation.isPending}>{mutation.isPending ? '添加中...' : '添加 TODO'}</button>);
}

4、删除数据(useMutation + 乐观更新)

React Query 的强大之处是:可以不用等服务器响应,先更新 UI,失败再回滚:

import { useMutation, useQueryClient } from '@tanstack/react-query';
import { deleteTodo } from './api/todoApi';export function DeleteTodoButton({ id }) {const queryClient = useQueryClient();const mutation = useMutation({mutationFn: () => deleteTodo(id),// 乐观更新onMutate: async () => {await queryClient.cancelQueries(['todos']);const previousTodos = queryClient.getQueryData(['todos']);queryClient.setQueryData(['todos'], (old: any[]) =>old.filter(todo => todo.id !== id));return { previousTodos };},// 失败时回滚onError: (_err, _variables, context) => {queryClient.setQueryData(['todos'], context.previousTodos);},// 成功后真正拉取最新数据onSettled: () => {queryClient.invalidateQueries(['todos']);},});return (<button onClick={() => mutation.mutate()}>删除</button>);
}

5、组件组合

export default function App() {return (<div><h1>Todo 管理(React Query)</h1><AddTodo /><TodoList /></div>);
}

三、React Query 能做什么?不能做什么?

负责管理“服务器状态”的难点:

  • 缓存
  • 后台刷新
  • 自动请求合并
  • 乐观更新
  • 错误恢复
  • 对象引用稳定性
  • 重新请求策略
  • 全局状态同步

不处理:

  • 本地 UI 状态(modal 是否打开?)
  • 表单状态
  • 跨组件 UI 状态

👉 这些依然由 useState/useReducer/Zustand 来处理。

http://www.dtcms.com/a/617615.html

相关文章:

  • 佛山cms建站帮人做兼职的网站
  • Spring Boot的web基础配置
  • 下载网站上的表格 怎么做天津市建设工程质量安全监督管理总队网站
  • 【Linux日新月异(八)】CentOS 7系统资源监控与排查深度指南:性能调优全景图
  • word中怎么查看插入的图片占用内存大小来压缩word文件整体大小
  • Flink CDC + MaxCompute用 MaxCompute Connector 打通实时入湖通道
  • 【AI 学习】AI Agent 开发进阶:架构、规划、记忆与工具编排
  • 二十三、Transformer架构详解
  • JAR逆向工程实战对比:传统工具 vs 自动化解决方案
  • 算法学习--离散化
  • 沈阳住房和城乡建设厅网站越南语网站怎么做
  • React + ECharts 实践:构建可交互的数据可视化组件
  • Devconnect 活动报名中!dAI 路线图、跨链 / 预言机创新新动态!Linera 实战+Web3 安全公开课上线!
  • 华为、阿里巴巴、字节跳动 100+ Linux面试问题总结(一)
  • [OpenHarmony6.0][Docker][环境]OHOS6 编译环境构建指南
  • 空包网站建设属于哪类网站排名优化推广厦门
  • async await 的前世今生
  • 外卖项目day02
  • 多电压输出场景下ASP3605负载调整率的一致性验证
  • 使用rust复刻linux经典命令:wc(文本统计工具)
  • 网站设计公司哪里好镇江网站建设找思创网络
  • 45_FastMCP 2.x 中文文档之FastMCP集成:Azure (Entra ID) 指南
  • 【微服务中间件】RabbitMQ 全方位解析:同步异步对比、SpringAMQT基础入门、实战、交换机类型及消息处理详解
  • 单点高ROI场景医疗AI编程分析与实践
  • 使用python进行PostgreSQL 数据库连接
  • 天线类型和指标介绍
  • Netty编写Echo服务器
  • 沙雕图片视频制作软件。制图内都是搞笔图制作模板,表白墙,节日祝福制作
  • 开源项目分享 图像深度学习Demo项目
  • 性能优化方向