TanStack Query介绍
TanStack Query(原 React Query)是一个专注于异步状态管理的开源库,核心目标是简化数据获取、缓存、同步和更新流程。它尤其擅长管理服务器状态(如 API 数据),与传统的客户端状态管理库(如 Redux)形成互补。
TanStack Query 的主要优势
1.简化的数据获取
TanStack Query 的 useQuery hook 使用简洁的声明式语法简化了数据获取。比如:
const { data, isLoading, error } = useQuery({
queryKey: ["todos"],
queryFn: () => fetchTodos(),
});
这个 hook 处理获取、缓存和错误状态,避免编写重复的样板代码。
2.查询去重
TanStack Query 的查询去重功能可防止对相同数据进行重复的 API 调用。当多个组件请求相同的数据(例如,用户个人资料)时,TanStack Query 会将它们合并为单个请求,从而降低服务器负载并提升性能,避免资源浪费。
3.自动缓存
TanStack Query 在首次请求后自动缓存数据,后续相同请求直接返回缓存结果,减少网络请求提升性能和用户体验。
4.乐观更新
TanStack Query 支持乐观的 UI 更新(Optimistic Updates)。当用户提交数据时,先更新 UI,再发送请求,如果请求失败则回滚,从而带来更流畅的用户体验。
5.分页和无限查询
简化分页和无限滚动模式的实现,使加载和显示大型数据集更加容易。
6.开发者工具:
TanStack Query 包含专用开发者工具,用于可视化查看缓存状态、查询历史及数据依赖图,提升调试效率。
使用示例
首先我们需要一个用于获取数据列表的查询函数:
// api.js
export async function fetchPosts() {
const response = await fetch('https://jsonplaceholder.typicode.com/posts')
return await response.json()
}
1. Installation
可以通过 npm 进行安装:
npm install @tanstack/react-query
2. 设置 QueryClient
// main.jsx
import { createRoot } from "react-dom/client";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import App from "./App.jsx";
const queryClient = new QueryClient();
createRoot(document.getElementById("root")).render(
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>,
);
3. 使用 useQuery 获取数据
// App.jsx
import { useQuery } from "@tanstack/react-query";
import { fetchPosts } from "./api";
function Posts() {
const { data, error, isLoading } = useQuery({ queryKey: ["posts"], queryFn: fetchPosts });
if (isLoading) return <p>Loading...</p>;
if (error) return <p>Error: {error.message}</p>;
return (
<ul>
{data.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
);
}
export default Posts;
4. 使用 Mutations 修改服务器上的数据
import { useMutation, useQueryClient } from "@tanstack/react-query";
function AddPost() {
const queryClient = useQueryClient();
const mutation = useMutation({
mutationFn: (newPost) =>
fetch("https://jsonplaceholder.typicode.com/posts", {
method: "POST",
body: JSON.stringify(newPost),
}),
onSuccess: () => {
// 添加新帖子后刷新缓存
queryClient.invalidateQueries({ queryKey: ["posts"] });
},
});
const handleAddPost = () => {
mutation.mutate({
title: "foo",
body: "bar",
userId: 1,
});
};
return (
<button onClick={handleAddPost} disabled={mutation.isPending}>
Add Post
</button>
);
}
export default AddPost;
TanStack Query 是否可以取代 Redux、MobX 或其他全局状态管理器?
根据 TanStack 团队的说法:
- TanStack Query 是一个服务器状态库,负责管理服务器和客户端之间的异步操作。
- Redux、MobX、Zustand 等都是客户端状态库,可用于存储异步数据,但与 TanStack Query 等工具相比效率较低。
对于绝大多数应用程序而言,将所有异步代码迁移到 TanStack Query 后,剩余的真正可全局访问的客户端状态通常非常小。
在某些情况下,应用程序可能确实包含大量仅用于客户端的同步状态(例如可视化设计器或音乐制作应用程序),在这种情况下,TanStack Query 不能替代本地/客户端状态管理。
总结
TanStack Query 是一款功能强大的工具,可用于管理服务器状态、简化异步数据处理并提升应用程序性能,告别繁琐的状态管理、手动重新获取以及层出不穷的异步代码。