TanStack Query 在 Vue3 中的完整新手指南(v5)
面向对象:第一次接触 TanStack Query 的同学(Vue3 +
<script setup>)
学习目标:掌握useQuery、useMutation的核心参数、状态和常见业务写法
1. 先搞懂它到底解决什么问题
在 Vue 里直接 watch + fetch 也能请求数据,但很快会遇到:
- 同接口重复请求
- 列表、详情、弹窗都要自己维护缓存一致性
- 重新聚焦页面、断网恢复、错误重试都要自己写
TanStack Query 专门解决“服务端状态管理”。
useQuery:读数据(GET)useMutation:写数据(POST/PUT/PATCH/DELETE)
2. 官方默认行为(新手一定要先知道)
这部分来自官方 Important Defaults:
- Query 默认是
stale(过期)状态。 - 过期 Query 在挂载、窗口聚焦、网络恢复时可能自动重新请求。
- 非活跃 Query 默认约
5分钟后回收(gcTime)。 - Query 默认失败重试
3次(指数退避)。 - Mutation 默认失败不重试(
retry: 0)。
3. 安装和初始化(只做一次)
4. useQuery:核心参数 + 返回值
4.1 基本写法
4.2 useQuery 主要参数(按优先级)
4.3 useQuery 常见返回值
5. useQuery 常用场景(带示例)
5.1 场景 A:页面打开自动拉列表
5.2 场景 B:依赖查询(Dependent Query)
先拿用户,再拿该用户的项目。官方建议用 enabled。
5.3 场景 C:分页查询避免 UI 闪烁(官方 keepPreviousData)
5.4 场景 D:懒查询(enabled: false)的正确理解
官方要点:
enabled: false时不会自动请求。- 会忽略
invalidateQueries/refetchQueries的自动触发能力。 - 若只是“条件满足再查”,更推荐
enabled: computed(() => !!keyword.value)。
6. useMutation:核心参数 + 返回值
6.1 基本写法
6.2 useMutation 主要参数
6.3 useMutation 常见返回值
7. useMutation 常用场景(带示例)
7.1 场景 A:新增成功后失效刷新(官方推荐)
7.2 场景 B:用 mutation 返回值直接更新缓存(官方 setQueryData)
注意:setQueryData 要返回新数据,不要直接改旧对象。
7.3 场景 C:乐观更新(官方常见模板)
8. Vue 场景下特别要注意的点
queryKey里放响应式值时,优先放ref/getter,不要过早解包成固定值。enabled推荐用computed或 getter,让依赖变化时自动重新评估。- 组合式函数封装查询时,参数尽量支持
Ref或 getter(见官方Reactivity指南)。 - 一样要把
signal传给请求层,才有自动取消能力。
9. 新手最容易踩的坑
- 把写操作放进
useQuery,导致语义和状态都混乱。 queryKey没带参数,分页/筛选共用同一缓存。- 把
isFetching当成“全屏 loading”,造成界面闪烁。 enabled: false滥用,丢失声明式刷新能力。setQueryData直接原地修改对象,造成不可预期行为。
10. 实战记忆卡(新人版)
- GET:
useQuery - POST/PUT/PATCH/DELETE:
useMutation - 提交成功后优先考虑:
invalidateQueries - 首屏 loading:
isPending - 后台刷新提示:
isFetching - 依赖条件查询:
enabled - 分页不闪屏:
placeholderData: keepPreviousData
11. 官方文档(建议按顺序看)
- Quick Start
https://tanstack.com/query/v5/docs/framework/vue/quick-start useQueryAPI
https://tanstack.com/query/v5/docs/framework/vue/reference/useQueryuseMutationAPI
https://tanstack.com/query/v5/docs/framework/vue/reference/useMutation- Query Keys
https://tanstack.com/query/v5/docs/framework/vue/guides/query-keys - Dependent Queries
https://tanstack.com/query/v5/docs/framework/vue/guides/dependent-queries - Disabling/Pausing Queries
https://tanstack.com/query/v5/docs/framework/vue/guides/disabling-queries - Paginated Queries
https://tanstack.com/query/v5/docs/framework/vue/guides/paginated-queries - Query Cancellation
https://tanstack.com/query/v5/docs/framework/vue/guides/query-cancellation - Invalidations from Mutations
https://tanstack.com/query/v5/docs/framework/vue/guides/invalidations-from-mutations - Updates from Mutation Responses
https://tanstack.com/query/v5/docs/framework/vue/guides/updates-from-mutation-responses - Optimistic Updates
https://tanstack.com/query/v5/docs/framework/vue/guides/optimistic-updates - Vue Reactivity
https://tanstack.com/query/v5/docs/framework/vue/reactivity

