useQuery useQuery 查询

最后更新:2026-10-28

useQuery useQuery 查询

TanStack Query 的 useQuery 管理整个「请求生命周期 + 缓存」:自动去重、后台刷新,staleTime 控制数据多久算新鲜,invalidateQueries 失效重取。组件只声明「我需要什么数据」,其余交给库。

分组数据与工程化
类型Hook
引入版本TanStack Query v5

ℹ️ 说明 编辑器将 JSX 转译为 JavaScript 后在沙箱中渲染真实界面;组件自动挂载,无需手写 render 调用。

📝 语法

import { useQuery } from '@tanstack/react-query'

const { data, isPending, isError, error, refetch } = useQuery({
  queryKey: ['todo', id],          // 缓存键:变化即切换/重新查询
  queryFn: () => fetch('/api/todos/' + id).then(r => r.json()),
  staleTime: 30_000                // 30 秒内数据新鲜,不重新请求
})
// isPending:无缓存首次加载;isFetching:任何后台刷新中

⚙️ 参数

queryKey缓存键(数组):['todos', id] 中 id 变化会切到对应缓存并重新请求;键相同则复用缓存。
staleTime数据保鲜期(毫秒):期内重挂载直接用缓存;过期后重挂载会后台静默刷新(stale-while-revalidate)。

返回值:返回 { data, isPending, isError, error, refetch, isFetching } 等查询状态:data 为最新数据,refetch 手动失效重取。

▶ 示例

示例可直接运行:展开后自动渲染,编辑代码即时生效。

输出结果:

第一次读取等 0.8 秒;之后点「读取」秒出(命中 Map 缓存);点「refetch」强制重新请求并更新缓存——staleTime 与失效的核心思想(模拟演示)。

💡 要点

💡 提示 queryKey 里放全部依赖(['todos', filter, page]),库会自动在依赖变化时重查——等于把 useEffect 依赖数组交给了缓存层。
⚠️ 注意 queryKey 必须包含全部请求参数且可序列化;漏了参数会导致不同数据共用同一缓存键,出现「张冠李戴」。
ℹ️ 说明 v5 把 loading 改名 isPending:isPending 表示无缓存首载,isFetching 表示含后台刷新,两者含义不同。
更多案例整理中,敬请期待。

📚 相关教程

❓ 常见问题

Q staleTime 和 gcTime(原 cacheTime)什么区别?
A staleTime 管「多久内数据算新鲜、不用重查」;gcTime 管缓存「多久没人用就回收」。前者影响请求频率,后者影响内存。
Q 数据变了怎么让它刷新?
A 调 refetch(),或用 queryClient.invalidateQueries({ queryKey }) 把相关查询标记失效,命中的组件自动后台重取。
Q 为什么要用数组做 queryKey 而不是字符串?
A 数组是结构化键:['todos', 2] 与 ['todos', 3] 精确区分;还能整体失效 ['todos'] 前缀下所有查询,层级化管理缓存。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏