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

TanStack Query Vue -vue的Axios Hooks

前言

随着 Hooks 思想 在前端的普及,Vue3 终于有了属于自己的 “一站式数据层”——TanStack Query Vue

定义

TanStack Query(曾用名 React Query)是一个强大的数据请求和缓存管理库,它与框架无关,同时提供了针对 Vue 的专门集成(@tanstack/vue-query),定位于 “数据层操作系统”,而非简单的 HTTP 客户端。它解决了前端开发中数据获取、缓存、同步和更新等常见问题,让开发者能更专注于业务逻辑而非数据管理细节。

核心功能

它对任何返回 Promise 的函数(axios/fetch/GraphQL SDK 等)做二次封装,提供:

智能数据缓存

  1. 自动缓存请求结果,避免重复请求
  2. 支持缓存失效和背景刷新
  3. 可配置的缓存时间和失效策略

数据同步与状态管理

  1. 自动处理加载、成功、错误等状态
  2. 提供乐观更新能力,提升用户体验
  3. 支持数据依赖和联动请求

请求优化

  1. 请求去重,防止并发重复请求
  2. 自动重试失败的请求
  3. 支持分页、无限滚动和懒加载

Vue 深度集成

  1. 基于 Vue Composition API 设计
  2. 提供响应式的数据和状态
  3. 与 Vue 的生命周期完美配合

与传统方案对比的优势

减少样板代码
无需手动管理 loading、error、data 等状态,也不需要编写重复的请求逻辑。

提升应用性能
通过智能缓存减少网络请求,降低服务器压力,同时加快应用响应速度。

增强用户体验
背景刷新、乐观更新等特性让应用感觉更流畅,减少等待感。

更好的开发体验
清晰的 API 设计,完善的 TypeScript 支持,以及丰富的调试工具。

灵活的配置选项
可以针对不同请求设置不同的缓存策略、重试机制等。

与 Vue 生态无缝集成
与 Vue 3 的 Composition API 自然契合,支持 Vue 的响应式系统。

与Axios 使用对比

能力

TanStack Query Vue

Axios

数据缓存

✅ 内置 LRU,自动垃圾回收

❌ 自己写 Map

分页/无限加载

✅ useInfiniteQuery 一行搞定

❌ 自行维护页码、累加数组

请求取消

✅ cancel() 或 AbortSignal 自动

❌ 手动 AbortController

依赖查询

✅ enabled 条件触发

❌ 自己写 watch

并行/串行

✅ 同时发或按依赖发

❌ Promise.all / then 链

乐观更新

✅ onMutate + 回滚

❌ 自己写快照 & 回滚

调试

✅ 官方 Devtools

❌ console.log

不同场景应用对比

场景

Axios 代码量

Axios 代码量

列表 + 下拉加载

50+ 行

10 行

详情页切换 ID 重新拉取

写 watch

queryKey

 自动触发

提交表单后刷新列表

手动再次 get()

onSuccess

里 invalidateQueries

断网重连自动重试

自己写定时器

 retry:3

 一行配置

Vue3 快速上手

安装

npm install @tanstack/vue-query

引入(main.js)

import { VueQueryPlugin } from '@tanstack/vue-query'createApp(App).use(VueQueryPlugin).mount('#app')

组件内

<script setup>import { useQuery } from '@tanstack/vue-query'const { data, isLoading, isError } = useQuery({queryKey: ['posts'],queryFn: () => axios.post('/api/posts').then(r => r.json())})</script><template><div v-if="isLoading">加载中...</div><div v-else-if="isError">请求失败</div><ul v-else><li v-for="p in data" :key="p.id">{{ p.title }}</li></ul></template>

不同场景使用案例

1. 条件查询

const { data } = useQuery({queryKey: ['user', userId],queryFn: () => axios.get(`/api/user/${userId.value}`).then(r => r.json()),enabled: !!userId.value   // userId 存在才发请求})

2、无限滚动

const {data,fetchNextPage,hasNextPage,isFetchingNextPage} = useInfiniteQuery({queryKey: ['comments'],queryFn: ({ pageParam = 1 }) =>axios.get(`/api/comments?page=${pageParam}`).then(r => r.json()),getNextPageParam: (last) => last.nextPage ?? false})

3. 并行多个请求

const ids = [1, 2, 3]const queries = ids.map(id =>useQuery({queryKey: ['item', id],queryFn: () => axios.get(`/api/item/${id}`).then(r => r.json())}))// queries[i].data 即对应结果

4. 表单提交 + 自动更新

const queryClient = useQueryClient()const { mutate } = useMutation({mutationFn: (newTodo) => axios.post('/api/todos', newTodo),onMutate: async (newTodo) => {await queryClient.cancelQueries(['todos'])const prev = queryClient.getQueryData(['todos'])queryClient.setQueryData(['todos'], old => [...old, newTodo])return { prev }},onError: (err, vars, context) =>queryClient.setQueryData(['todos'], context.prev),onSettled: () => queryClient.invalidateQueries(['todos'])})

当然除了以上几种案例,还有更多高级功能比如:轮询/实时查询、窗口聚焦时重新获取、离线支持、滚动恢复等;

调试工具

@tanstack/vue-query-devtools 是 TanStack Query 为 Vue 应用提供的开发工具扩展,专为调试和监控基于 @tanstack/vue-query 的数据请求而设计。它能帮助开发者直观地查看和管理应用中的查询状态、缓存数据、请求历史等,极大简化了数据请求相关的调试工作。

特点

查询状态可视化

  1. 实时展示所有活跃查询(queries)和变更(mutations)
  2. 清晰显示每个请求的状态(加载中、成功、错误)
  3. 查看查询的键(queryKey)、缓存数据、响应时间等详细信息

缓存管理工具

  1. 直接在开发工具中查看和编辑缓存数据
  2. 手动触发查询失效(invalidate)、刷新(refetch)等操作
  3. 清除特定或全部缓存,方便测试缓存策略

请求历史追踪

  1. 记录所有请求的历史记录,包括参数、响应和错误信息
  2. 支持筛选和搜索特定请求,快速定位问题

性能监控

  1. 显示请求耗时、重试次数等性能指标
  2. 识别重复请求或不必要的请求,帮助优化应用性能

使用:

import { VueQueryDevTools } from '@tanstack/vue-query-devtools'app.use(VueQueryDevTools)

总结

Axios 作为被广泛应用的 HTTP 客户端,但在 “数据层” 需求日益复杂的今天,TanStack Query Vue 把「取数据、管数据、刷新数据」做成了 配置驱动

总之,TanStack Query Vue 为 Vue 应用提供了现代化的数据请求解决方案,特别适合中大型应用,能够显著提升开发效率和应用质量。


文章转载自:

http://gfOppNHi.hwwtx.cn
http://5aFWByF6.hwwtx.cn
http://H2aO4tpL.hwwtx.cn
http://3twXCjsr.hwwtx.cn
http://7rslG0mL.hwwtx.cn
http://nVZtUreh.hwwtx.cn
http://1Iu0fT4D.hwwtx.cn
http://3KdfYWlQ.hwwtx.cn
http://iOMmminU.hwwtx.cn
http://wusQFzQf.hwwtx.cn
http://0albbTbU.hwwtx.cn
http://U4lSRdGs.hwwtx.cn
http://Ug2otZFc.hwwtx.cn
http://Rw974txW.hwwtx.cn
http://pKrM9iH4.hwwtx.cn
http://4d1ISe9l.hwwtx.cn
http://7eRkfjnt.hwwtx.cn
http://4rzubS5L.hwwtx.cn
http://496P1XPU.hwwtx.cn
http://3I6Pfehp.hwwtx.cn
http://Hp0u7WTh.hwwtx.cn
http://OpjFTs7a.hwwtx.cn
http://mFFpXH1g.hwwtx.cn
http://PbKakZEY.hwwtx.cn
http://PQrtmKkH.hwwtx.cn
http://azfgqyEM.hwwtx.cn
http://zLvSgHOF.hwwtx.cn
http://iEQ0CD5b.hwwtx.cn
http://M9EtLirS.hwwtx.cn
http://NLZv49Ov.hwwtx.cn
http://www.dtcms.com/a/376345.html

相关文章:

  • 鸿蒙应用之网络请求方案总结
  • 技术文章大纲:AI绘画—动漫角色生成赛
  • HTTPS 端口号详解 443 端口作用、iOS 抓包方法、常见 HTTPS 抓包工具与网络调试实践
  • 【iOS】单例模式
  • 工业智能终端赋能自动化生产线建设数字化管理
  • 在Vue项目中Axios发起请求时的小知识
  • eclipse怎么把项目设为web
  • 三维GIS开发实战!Cesium + CZML 实现火箭飞行与分离的 3D 动态模拟
  • Hybrid应用性能优化实战分享(本文iOS 与 H5为例,安卓同理)
  • Python 常用数据类型详解:相同点、差异与使用指南
  • Elasticsearch安装启动常见问题全解析
  • webpack turbopack vite 前端打包工具
  • NLP项目实战 | Word2Vec对比Glove进行词类比测试
  • 基于密集型复杂城市场景下求解无人机三维路径规划的Q-learning算法研究(matlab)
  • 南京大学 LLM开发基础(一)前向反向传播搭建
  • GitHub 热榜项目 - 日榜(2025-09-10)
  • 基于YOLO集成模型的无人机多光谱风电部件缺陷检测
  • ssh域名过期,消息推送到企业微信
  • 【Python】爬虫html提取内容基础,bs4
  • zabbix告警推送钉钉
  • Android系统框架知识系列(二十):专题延伸:JVM vs ART/Dalvik - Android运行时演进深度解析
  • 关于在pycharm终端连接服务器
  • VPS、云服务器、独立服务器的区别是什么?新手服务器选择指南
  • 10. 游戏开发中的TCP与UDP
  • 第1章:操作系统和计算机网络
  • 在uniapp/vue项目中全局挂载component
  • 【ubuntu 24.04 LTS】真实实验部署ollama0.11.6+deepseekR1:1.5b+open-webUI
  • [万字长文]AJAX入门-常用请求方法和数据提交、HTTP协议-报文、接口文档、案例实战
  • 基于 Vue3 + VueOffice 的多格式文档预览组件实现(支持 PDF/Word/Excel/PPT)
  • 【Unity UGUI 交互组件——Scrollbar(8)】