Доки по разработке
This project is maintained by teniryte
Эта глава объединяет три production-сценария:
import { QueryClient } from '@tanstack/react-query'
import { persistQueryClient } from '@tanstack/react-query-persist-client'
import { createSyncStoragePersister } from '@tanstack/query-sync-storage-persister'
const queryClient = new QueryClient({
defaultOptions: {
queries: {
gcTime: 24 * 60 * 60 * 1000,
},
},
})
persistQueryClient({
queryClient,
persister: createSyncStoragePersister({
storage: window.localStorage,
}),
maxAge: 24 * 60 * 60 * 1000,
buster: 'v1',
})
Важно:
gcTime должен быть не меньше maxAge, иначе данные могут удалиться раньше восстановления.buster.Персистить стоит:
Осторожно с:
Используйте shouldDehydrateQuery, если нужно фильтровать.
Для React Native/Expo используется async persister:
createAsyncStoragePersisterAsyncStorage или собственный storage adapterИдея та же, отличается только storage backend.
onlineManager и focusManagerМожно переопределять источники событий:
import { onlineManager, focusManager } from '@tanstack/react-query'
onlineManager.setEventListener((setOnline) => {
window.addEventListener('online', () => setOnline(true))
window.addEventListener('offline', () => setOnline(false))
return () => {
window.removeEventListener('online', () => setOnline(true))
window.removeEventListener('offline', () => setOnline(false))
}
})
Это особенно полезно для:
networkModeДоступные режимы:
onlinealwaysofflineFirstОбычно:
onlineofflineFirstПосле восстановления из persister и возврата сети полезно:
await queryClient.resumePausedMutations()
Это особенно важно, если вы храните offline queue.
QueryClient на сервере.prefetchQuery или ensureQueryData.dehydrate(queryClient).HydrationBoundary.Современный рекомендуемый подход:
HydrationBoundaryuseQueryПример:
import {
dehydrate,
HydrationBoundary,
QueryClient,
} from '@tanstack/react-query'
export default async function PostsPage() {
const queryClient = new QueryClient()
await queryClient.prefetchQuery(postsOptions())
return (
<HydrationBoundary state={dehydrate(queryClient)}>
<PostsClient />
</HydrationBoundary>
)
}
useQuery, а не useSuspenseQueryЕсли данные уже были префетчены и гидратированы, обычный useQuery обычно достаточно хорош:
Suspense всё ещё полезен, но не обязателен для уже прогретых запросов.
QueryClient.staleTime, чтобы клиент сразу после hydration не делал лишний refetch.