TanStack Query 的维护者 TkDodo 撰写了一系列关于使用和操作该库的博客文章。其中一些文章介绍了通用的最佳实践,但大多数文章都带有主观的视角。
这是一篇关于 React Query 的高级介绍,其中包含了一些超出文档范围的实用技巧。它涵盖了默认值的解释(staleTime 与 gcTime),像保持服务器和客户端状态分离、处理依赖关系和创建自定义 hooks 等概念,并概述了 enabled 选项为何如此强大。阅读更多...
学习使用 React Query 执行数据转换的各种可能性,这是一个非常常见且重要的任务。从在 queryFn 中进行转换,到使用 select 选项,本文概述了所有不同方法的优缺点。阅读更多...
让我们来看看在使用 React Query 时,当组件过于频繁地重新渲染时,你可以做些什么。该库本身已经非常优化,但仍有一些可选功能(如 tracked queries),你可以使用它们来避免 isFetching 的切换。我们还将探讨 structural sharing 的含义。阅读更多...
我们通常会先检查 isPending,然后再检查 isError,但有时,检查 data 是否可用应该是首要任务。本文展示了错误的状态检查顺序如何对用户体验产生负面影响。阅读更多...
官方文档已经很好地涵盖了测试 React Query 的入门知识。本文介绍了一些额外的技巧(例如关闭 retries 或静默 console),当你测试自定义 hooks 或使用它们的组件时,你可能会遵循这些技巧。它还链接到一个带有成功和错误状态测试的示例仓库,该仓库由 mock-service-worker 提供支持。阅读更多...
由于 React Query 是用 TypeScript 编写的,因此它对 TypeScript 有很好的支持。这篇博文解释了各种泛型,如何利用类型推断来避免显式键入 useQuery 及其相关函数,如何处理 unknown 错误,类型收窄如何工作等等!阅读更多...
这是一份关于如何使用 React Query 实现实时通知的分步指南,可以使用基于事件的订阅或直接将完整数据推送到客户端。适用于从浏览器原生 WebSocket API 到 Firebase,甚至 GraphQL 订阅的各种场景。阅读更多...
大多数示例仅使用简单的字符串或数组查询键,但当你的应用程序规模超出待办事项列表时,如何有效地组织你的键?本文介绍了共同定位和查询键工厂如何使生活更轻松。阅读更多...
在这篇对上一篇博文的补充中,我们将探讨如何利用查询函数上下文和对象查询键,在应用程序不断增长时实现最大程度的安全。阅读更多...
占位符数据和初始数据是两个相似但又不同的概念,用于同步显示数据而不是加载微调器,以改善应用程序的用户体验。这篇博文比较了两者,并概述了它们各自适用的场景。阅读更多...
React Query 本身不为你获取任何数据 - 它是一个数据同步工具,在用于服务器状态时表现出色。本文包含了让 React Query 成为你的异步状态管理器单一数据源所需的一切。你将学会如何让 React Query 发挥其魔力,以及为什么自定义 staleTime 可能是你所需要的一切。阅读更多...
错误处理是处理异步数据(尤其是数据获取)的内在部分。我们必须面对它:并非所有请求都会成功,并非所有 Promise 都会被履行。这篇博文描述了在 React Query 中处理错误的各种方法,例如 error 属性、使用 Error Boundaries 或 onError 回调,以便你可以为“出现问题”的情况做好应用程序的准备。阅读更多...
Mutations 是处理服务器数据的第二部分,用于需要更新数据的情况。这篇博文涵盖了 mutations 是什么以及它们与 queries 有何不同。你将学会 mutate 和 mutateAsync 之间的区别,以及如何将 queries 和 mutations 联系起来。阅读更多...
生成 Promise 的方法有很多——这正是 React Query 所需要的——但最大的用例是数据获取。通常,这需要有效的网络连接。但有时,尤其是在网络连接可能不可靠的移动设备上,你需要应用程序也能离线工作。在本文中,你将了解 React Query 提供的各种离线策略。阅读更多...
表单往往会模糊服务器状态和客户端状态之间的界限。在大多数应用程序中,我们不仅希望显示状态,还希望允许用户与之交互。本文展示了两种不同的方法以及一些关于将 React Query 与表单一起使用的技巧。阅读更多...
本文试图回答关于 React Query 最常见的问题。阅读更多...
Remix 和 React Router 正在改变关于*何时*获取数据的想法。本文将深入探讨为什么 React Query 和支持数据加载的 Router 是天作之合。阅读更多...
这篇博文展示了多种方法,可以在开始渲染*之前*将数据放入你的查询缓存中,以最大限度地减少应用程序中显示的加载微调器数量。选项包括在服务器或路由器上预取,以及通过 setQueryData 预填充缓存条目。阅读更多...
如果你曾经想知道 React Query 在底层是如何工作的——这篇文章就是为你准备的。它解释了架构(包括图示),从与框架无关的 Query Core 开始,以及它如何与特定于框架的适配器进行通信。阅读更多...
“拥有类型”和“类型安全”之间有很大区别。本文试图概述这些区别,并展示如何在使用 React Query 和 TypeScript 时获得最佳的类型安全性。阅读更多...
如果你的应用程序不依赖于客户端数据获取,尤其是在使用 Next.js 或 Remix 等带有内置服务器组件的框架时,React Query 可能是不必要的。尽管如此,它在混合使用场景(如无限滚动或离线支持)中仍然表现出色,其智能缓存和重新验证功能非常有价值。阅读更多...
React Query 不是一个数据获取库——它是一个异步状态管理器,旨在将参数视为依赖项,通过 staleTime 优化重新获取行为,并鼓励以 queryKey 驱动缓存和更新的声明式模式。思维方式的微小转变可以极大地简化你使用 React Query 的方式。阅读更多...
React Query 允许组件独立管理自己的数据,使其具有自给自足和弹性。但当更深层组件需要共享数据(如在上方获取的用户信息)时,React Context 可以使这种隐式依赖关系显式化并更安全。阅读更多...
虽然在 useEffect 中使用 fetch 获取数据看似简单,但很快就会出现竞态条件、缺少加载状态、陈旧数据和 Strict Mode 的怪异行为等 bug,使得异步状态管理比看起来要复杂得多。阅读更多...
React Query v5 引入了一个统一的“查询选项”API——所有函数,如 useQuery、invalidateQueries 和命令式调用都接受一个单一对象——简化了接口,并使跨不同查询上下文的重用更加容易,同时提高了类型安全性。阅读更多...
React Query 不会自动将 mutations 与 queries 绑定——但你可以利用中央 MutationCache 中的“全局缓存回调”来定义共享行为,例如在每次 mutation 时使查询失效。阅读更多...
这篇博文深入探讨了 Infinite Queries 的设计和工作原理。有趣的是,并没有一个独立的 InfiniteQuery 表示——只是附加到常规 Queries 上的不同“行为”。阅读更多...
在这场讲座中,Dominik 带领我们回顾了 React Query 在 API 设计方面的一些选择,以实现其可以说是优秀的用户体验。你将听到关于哪些方面做得好,也关于所做的权衡和错误,以及我们都能从中吸取的教训。阅读更多...
在这场讲座中,Dominik 探讨了 React Query 不那么令人称道的一面以及它可能不是最佳选择的情况。没有完美的库;每个选择都有取舍。听完这场讲座,你将对 React Query 的局限性有更好的理解,以及为什么尽管存在这些局限性,它仍然是一个有吸引力的选择。阅读更多...
React Query 中的乐观更新在多个 mutations 同时运行时可能导致竞态条件,从而导致 UI 状态不一致。取消进行中的 queries 有所帮助,但重叠的无效化可能仍然会覆盖较新的更新。阅读更多...
React Query 的 select 选项允许组件仅订阅其关心的查询数据的特定部分——因此更新一个字段不会不必要地导致不相关的 UI 重新渲染。这种细粒度的方法可以在缓存中保留完整的响应,同时优化组件更新以提高性能。阅读更多...