惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
博客园_首页
H
Help Net Security
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
GbyAI
GbyAI
Scott Helme
Scott Helme
D
Docker
Hacker News: Ask HN
Hacker News: Ask HN
P
Privacy & Cybersecurity Law Blog
Jina AI
Jina AI
雷峰网
雷峰网
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
G
GRAHAM CLULEY
C
Cisco Blogs
The Hacker News
The Hacker News
F
Full Disclosure
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
Recent Announcements
Recent Announcements
G
Google Developers Blog
量子位
K
Kaspersky official blog
Cisco Talos Blog
Cisco Talos Blog
The Cloudflare Blog
A
About on SuperTechFans
C
Cybersecurity and Infrastructure Security Agency CISA
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
Martin Fowler
Martin Fowler
T
Tenable Blog
P
Palo Alto Networks Blog
H
Heimdal Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Schneier on Security
Schneier on Security
The Register - Security
The Register - Security
F
Fortinet All Blogs
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Blog of Author Tim Ferriss
N
News and Events Feed by Topic
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
V
V2EX
爱范儿
爱范儿

博客园 - 若-飞

企业AI Agent落地的核心逻辑与路径 基于langchain,Function Call的成功率怎么解决? LangChain Checkpoint(检查点)是什么?—— Agent 的"存档机制" RAG 设计:Embedding 如何切分 AI 客服系统设计:RAG 知识库设计 Go 百万连接服务器设计:从网卡到业务的全链路解析 深度解析 sync.Pool:从设计哲学到生产实践 Goroutine 泄漏:原因、检测与防范 Go Channel 关闭与超时机制完全指南 Go Map 无限增长问题解决方案 LangChain 聊天记录压缩:原理、机制与实战 揭开 sklearn 文本分类的核心原理:从词袋到逻辑回归 大模型“胡说八道”怎么办?一张图读懂检测、评估与修复全方案 企业级AI知识库权限隔离设计:让AI“懂规矩”比“懂知识”更重要 RAG系统设计全解析:从架构到多模态的核心知识图谱 RAG召回率提升全攻略:7大核心方法让检索更精准 RAG召回率提升秘籍:Metadata过滤的底层原理与实践 构建更好的RAG系统:深入理解混合搜索 一文搞懂 RAG 中 Retriever 和 Reranker 的区别 一文搞懂 RAG 的召回率(Recall)是什么? LangChain / LangGraph、MCP、Harness Engineer 与 Claude Code 的对应关系 Agent Harness 技术笔记:从 Trajectory 到 Function Calling Loop BLEU 是什么?——从原理到工程实践 一文讲清:Approve / Permit / Permit2 的本质区别 分库分表后跨分页查询的完整方案 ai如何处理私有数据 ai幻觉是啥,以及如何解决 别再让大模型“凭空瞎猜”了!带你认识AI最强外挂:ChromaDB HD钱包--BIP44 TRON 四种 API 面怎么选:从节点协议到 JSON-RPC 再到 TronGrid 以太坊节点存储与共识机制全解析 BSC节点发现协议全解析:UDP发现、Bootnode引导与Gossip交易广播 以太坊节点发现背后的分布式哈希表(DHT)与 Kademlia 原理解析 Solidity中的bytes与string:深入理解这两种特殊的动态数组 智能合约自毁:当资产还在,合约死了 —— 深度解析 selfdestruct 导致的资产锁定风险 TDengine CLI (taos) 使用指南 —— Docker 本地开发实战 在 macOS 上用 DBeaver 连接 TDengine:踩坑总结与最终配置指南 Solidity Storage Slot 深度解析 Geth Snapshot Export/Import 深度解析: 不是备份工具,而是数据分析利器 基于BSC 公链的数据备份与 Snapshot 机制深度解析 Docker 共享内存完全指南:从原理到实践,避免常见的理解误区 Docker容器"僵尸状态"问题排查与自动重启方案 SSE协议深度解析:被低估的HTTP服务器推送标准 TDengine vs MySQL:时序数据处理的时代之选 Proxmox 启用 QEMU Guest Agent 实战指南 解决 Blockscout "batch too large" 错误的完整指南 一文讲清楚什么是基准测试(Benchmark) Rust中的宏(Macro):编译时的代码生成魔法 Docker优雅关闭的艺术:为什么stop_grace_period能防止数据丢失 为什么 Go 没有依赖注入和 Bean 机制?语言设计哲学对比
用 useQuery 管请求:TanStack React Query 入门小结
若-飞 · 2026-05-08 · via 博客园 - 若-飞

在 React 里拉接口,最朴素的做法是 useEffect + useStateloadingerrordata 自己维护,还要处理重复请求、切换页面再回来要不要重新拉等问题。TanStack React Query(原 React Query)把这些抽成一套约定,其中 useQuery 是最常用的「读数据」入口。


1. useQuery 是干什么的?

一句话:在组件里声明「我要某份数据」,库里帮你 发请求、缓存、更新 UI 状态、按需重试 / 重拉

你写的主要就两样:

  • queryKey:这份数据在缓存里的「身份证」(还能带上参数,变了就算另一份数据)。
  • queryFn:真正去请求的异步函数(一般里面 fetch),成功返回值进缓存失败进错误。

组件里直接用 dataisLoadingerror 渲染即可。


2. 为什么要用这一套?解决了什么?

它特别适合:列表、详情、用户信息、行情 这类「可读、可被缓存」的数据。(写操作用 useMutation,这里不展开。)


3. 三个必懂概念:queryKeyqueryFn、返回值

3.1 queryKey

  • 类型:通常是 数组,例如 ["markets", limit, categoryId]
  • 作用
    1. 缓存键:完全一样就命中同一份缓存。
    2. 依赖语义**queryKey** 里任一项变了 = 这是一条「新查询」,会重新跑 queryFn`(或使用新缓存)。

习惯把 所有会影响请求结果的变量都放进 key,避免「参数变了却还在用旧数据」。

3.2 queryFn

  • 返回值:通常是 Promise,resolve 的结果就是 data 的类型
  • 失败throw Error(或 rejection),React Query 会记成 error,并可用 retry 重试。

在 TypeScript 里常写成:

这样 data 推断更稳。

3.3 常用返回值(读数据就够用的子集)

  • data:最后一次成功拿到的数据(未成功前多为 undefined)。
  • isLoading:「还没有可用的缓存且正在初次拉取」时为 true(语义随 v5 略有细化,可查官方文档)。
  • isFetching:只要在读(含后台刷新)就为 true。
  • error:失败时的错误。
  • refetch:手动再拉一手。

还有更多字段(statusfetchStatusisStale…),按需查文档。


4. 和你项目里的 useMarkets 怎么对上号?

示例(简化):

含义大致是:

  • queryKey 带 limitcategoryId:分类或条数一变,markets 就当新的一组缓存重新拉。
  • staleTime:数据在这段时间内可能被当成「尚且新鲜」,减少无意义刷新(具体行为结合 refetch 策略)。
  • refetchInterval:定时自动再跑 queryFn,适合做 短时轮询(例如价格和列表)。

这正是「手写 useEffect + setInterval」里容易漏边界的地方,库里帮你收口。


5. 和 useEffect 的常见对比(心智模型)

  • useEffect:「挂载 / 依赖变了以后,执行一段副作用」——你完全自己管请求与状态。
  • useQuery:「我声明 queryKey + 如何取数,库负责 缓存生命周期 + 异步状态」。

不是「替换所有 useEffect」,而是 凡是以服务端数据为主的读模型,优先用 Query


6. 使用上几个小坑(博客读者友好版)

  1. queryFn 里不要用 props 却没写进 queryKey:会用到旧闭包变量,或缓存错乱。
  2. Key 别太粗也别太细:太短容易错误共享缓存;太长、含对象引用不稳时,宜用稳定 id(字符串、数字)。
  3. SSR / Next App Router:注意 QueryClient 建议是 浏览器侧单例,避免和服务端混淆;官方有 ReactQueryProvider 示例。
  4. 和后端报错约定:HTTP 非 2xx 时记得 throw,否则 React Query 以为「成功了」。

7. 小结

  • useQuery = queryKey(我是谁) + queryFn(怎么取)
  • 核心价值:缓存、复用、自动跟踪依赖、异步状态统一、可选轮询 / 失效策略
  • 和你们 demo 里的 useMarkets 一样:同一套机制既能拉 Gamma 聚合列表,又能定时补 CLOB 价格,而组件只消费 data / isLoading

若要进阶,可查官方文档里的:invalidateQueries(mutation 后作废缓存)queryClient.prefetchQuery(预取)placeholderData / keepPreviousData(分页体验)


如果你希望这篇落到仓库里(例如 docs/blog-react-query-useQuery.md),可以说一声我按你文档风格再排版一版并保存路径。