自动

宣布 TanStack Query v5

作者 Dominik Dorfmeister 于 2023 年 10 月 17 日发布。大约一年前,我们宣布了 TanStack Query v5 的路线图,此后整个团队一直在为这个版本努力。因此,我们非常高兴地宣布,今天就是这一天:经过 91 个 alpha 版本、35 个 beta 版本和 16 个 release candidates 版本,TanStack Query v5.0.0 终于到来!🎉

v5 继续了 v4 的历程,力求使 TanStack Query 更小(v5 比 v4 小约 20%)、更好,并且使用起来更直观。此版本的主要关注点之一是精简和简化我们提供的 API。

重大更改

作为一项重大更改,我们从代码库中移除了大多数重载,统一了 useQuery 和其他钩子的用法。这是我们在 v4 中就想做的事情,但 TypeScript 的限制 阻止了我们。TypeScript 在 TS 4.7 中解决了这个问题,因此我们能够移除所有用于使用不同参数数量调用 useQuery 的重载。这对开发者体验来说是一个巨大的胜利,因为带有重载的方法通常会有非常糟糕的 TypeScript 错误信息。

这是 v5 中最大的重大更改,但我们认为这是值得的。API 现在更加一致——你始终只需传递一个对象。为了减轻手动更改所有出现的地方的痛苦,我们在过去几个月里一直努力让每个人为这个即将到来的变化做好准备。文档已更改为使用新 API,我们在 eslint 包中发布了一个可自动修复的 eslint 规则。此外,v5 还附带了 codemod 来帮助过渡。

除此之外,我们已将 cacheTime 重命名为 gcTime 以更好地反映其功能,将 keepPreviousDataplaceholderData 合并,将 loading 状态重命名为 pending,并useQuery 中移除了回调。所有这些更改都使 v5 成为新入门者的最一致、最好的版本。

要了解更多关于重大更改的信息,请查看我们的 迁移指南

新功能

当然,v5 还带来了许多令人惊叹的新功能 🚀

简化的乐观更新

通过利用 useMutation 返回的 variables,享受一种全新的、简化的执行乐观更新的方法,无需编写手动更新缓存的代码。有关更多详细信息,请查看 乐观更新文档

可共享的突变状态

v5 终于实现了这项长期以来备受用户期待的功能,正如这个 两年之久的 issue 所体现的:现在,您可以访问所有突变的状态,并通过新的 useMutationState 钩子在组件之间共享。

一流的 suspense 支持

没错——数据获取的 suspense 不再是实验性的,而是完全受支持的。React Query 提供了新的 useSuspenseQueryuseSuspenseInfiniteQueryuseSuspenseQueries 钩子。有关与非 suspense 版本之间的区别,请查看 suspense 文档

与 React Server Components 流式传输

v5 还为 Next.js 中的服务器上的 suspense 提供了一个实验性集成,统一了两个世界的优点:react-query-next-experimental 适配器允许我们编写一个单一的 useSuspenseQuery,它将尽可能早地启动数据获取:在服务器上,在 SSR 期间。然后,它会将结果流式传输到客户端,并自动放入缓存中,从而为我们提供 React Query 的所有交互性和数据同步功能。

改进的 Infinite Queries

Infinite Queries 现在可以一次性 预取多个页面,并且您可以选择指定缓存中存储的最大页面数量

新的 Devtools

Query devtools 已从头开始以一种框架无关的方式重写,以便可用于所有适配器。它们还进行了 UI 大修,并增加了一些新功能,如缓存内联编辑和浅色模式。

精细持久化

另一个长期存在的 2021 年的讨论突显了即时恢复(尤其对于移动开发)的精细持久化的重要性,这是 PersistQueryClient 插件所不具备的。v5 中,我们现在有一个新的 experimental_createPersister 插件,允许您单独持久化查询。

queryOptions API

既然我们有了调用 useQuery 的统一方式(只需传递一个对象作为参数),我们也可以在此基础上构建更好的抽象。新的 queryOptions 函数为我们提供了一种类型安全的方式来共享 useQuery 和命令式方法(如 queryClient.prefetchQuery)之间的查询定义。此外,它还可以使 queryClient.getQueryData 成为类型安全的。


谢谢

我们希望您能像我们开发它一样喜欢使用 v5。我们还能说什么呢,感谢所有促成这次发布的人。无论您是核心贡献者,实现了路线图上的某个功能,还是修正了文档中的一个错别字,或是对 alpha 版本提供了反馈:每一次贡献都很重要!正是人们让这个库如此伟大,我们很荣幸拥有如此出色的社区。❤️