【发布时间】:2021-07-04 02:03:29
【问题描述】:
我有一个 React SPA,我正在尝试使用 ReactQuery 库。我从我的服务器 API 中获取了很多不同的数据——一些更不稳定,另一些相对稳定。我想将稳定的数据存储在浏览器的本地存储中,以减少对服务器的请求数量(从而使 UI 应用程序更快一些)并每 24 小时刷新一次。但是,我想在每个请求中使易失性数据无效并重新获取,因为其他用户可能同时更改了数据。
目前,我的应用周围只有一个简单的 ReactQueryProvider:
import React from 'react';
import { QueryClientProvider } from 'react-query';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
import { CookiesProvider } from 'react-cookie';
import { QueryClient } from 'react-query';
import { HttpError } from 'types';
const MaxFailureCount = 2;
const baseUrl = document.getElementsByTagName('base')[0].getAttribute('href') || undefined;
const rootElement = document.getElementById('root');
function shouldRetry(failureCount: number, error: unknown): boolean {
if (error instanceof HttpError) {
if (!error.isRetryableError()) {
return false;
}
}
return failureCount < MaxFailureCount;
}
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
retry: shouldRetry,
},
},
});
ReactDOM.render(
<QueryClientProvider client={queryClient}>
<BrowserRouter basename={baseUrl}>
<CookiesProvider>
<App />
</CookiesProvider>
</BrowserRouter>
</QueryClientProvider>,
rootElement
);
如果我想使用persistQueryClient 插件,我必须将cacheTime 添加到我的queryClient,然后将客户端传递给localStoragePersistor。如果我正确理解了文档,这将改变我所有的 useQuery 调用,将数据存储在本地存储中 24 小时 - 即使是更易变的数据。
可以选择将buster 字符串传递给持久化缓存,但这会使所有数据(甚至是稳定的)无效。有没有办法使用两个不同的queryClients?或者,在每个useQuery 调用中指定是否应该缓存响应?还是应该手动将稳定数据 API 的响应放入本地存储?如果是这样,我该如何处理失效?
【问题讨论】:
标签: javascript reactjs typescript react-query