React Query - 查询没有使用缓存?
React Query - query is not using cache?
我在几个 React 组件中使用了 useQuery
的以下定义:
useQuery("myStuff", getMyStuffQuery().queryFn);
其中 getMyStuffQuery
看起来像这样:
export const getMyStuffQuery = () => {
return {
queryFn: () => makeSomeApiCall(),
}}
我希望尽管所有这些组件都呈现,makeSomeApiCall()
只会进行一次 API 调用,其余时间将使用第一次调用产生的缓存。
但是,每当任何上述组件呈现时,它似乎都会一次又一次地调用 makeSomeApiCall()
。
为什么 React Query 没有使用缓存?我做错了什么吗?
React Query 默认会缓存查询的数据,但这并不影响它是否认为数据过时。如果它认为数据过时,它会在每次调用 useQuery()
时调用查询函数(点击 API)。这意味着它会从缓存中读取数据(如果有),但由于它认为数据已过时,因此仍会在后台访问 API 以获取任何更新的数据。
幸运的是,您可以完全控制 React Query 是否认为数据已过时。您可以设置 staleTime
配置选项来控制特定数据应被视为新鲜的时长。您甚至可以将其设置为 Infinity
,表示只要您的应用程序处于打开状态,它就应该只调用一次查询函数(点击 API)。默认情况下,此值为 0,这就是为什么你会看到你的行为 - 每次调用 useQuery
时,React Query 都会在后台重新获取数据,因为它会立即认为数据已过时(即使它仍在缓存中) ).
在您的示例中,如果您真的只想调用一次 API,则只需将 staleTime
选项设置为 Infinity
。
useQuery("myStuff", getMyStuffQuery().queryFn, { staleTime: Infinity });
可以在此处的文档中阅读此选项以及所有其他选项 https://react-query.tanstack.com/reference/useQuery
我在几个 React 组件中使用了 useQuery
的以下定义:
useQuery("myStuff", getMyStuffQuery().queryFn);
其中 getMyStuffQuery
看起来像这样:
export const getMyStuffQuery = () => {
return {
queryFn: () => makeSomeApiCall(),
}}
我希望尽管所有这些组件都呈现,makeSomeApiCall()
只会进行一次 API 调用,其余时间将使用第一次调用产生的缓存。
但是,每当任何上述组件呈现时,它似乎都会一次又一次地调用 makeSomeApiCall()
。
为什么 React Query 没有使用缓存?我做错了什么吗?
React Query 默认会缓存查询的数据,但这并不影响它是否认为数据过时。如果它认为数据过时,它会在每次调用 useQuery()
时调用查询函数(点击 API)。这意味着它会从缓存中读取数据(如果有),但由于它认为数据已过时,因此仍会在后台访问 API 以获取任何更新的数据。
幸运的是,您可以完全控制 React Query 是否认为数据已过时。您可以设置 staleTime
配置选项来控制特定数据应被视为新鲜的时长。您甚至可以将其设置为 Infinity
,表示只要您的应用程序处于打开状态,它就应该只调用一次查询函数(点击 API)。默认情况下,此值为 0,这就是为什么你会看到你的行为 - 每次调用 useQuery
时,React Query 都会在后台重新获取数据,因为它会立即认为数据已过时(即使它仍在缓存中) ).
在您的示例中,如果您真的只想调用一次 API,则只需将 staleTime
选项设置为 Infinity
。
useQuery("myStuff", getMyStuffQuery().queryFn, { staleTime: Infinity });
可以在此处的文档中阅读此选项以及所有其他选项 https://react-query.tanstack.com/reference/useQuery