// app/providers.tsx
'use client'
import {
isServer,
QueryClient,
QueryClientProvider,
} from '@tanstack/react-query'
import * as React from 'react'
import { ReactQueryStreamedHydration } from '@tanstack/react-query-next-experimental'
function makeQueryClient() {
return new QueryClient({
defaultOptions: {
queries: {
// 使用 SSR 时,通常希望设置一个大于 0 的默认 staleTime
// 以避免在客户端立即重新获取
staleTime: 60 * 1000,
},
},
})
}
let browserQueryClient: QueryClient | undefined = undefined
function getQueryClient() {
if (isServer) {
// 服务端:始终创建新的查询客户端
return makeQueryClient()
} else {
// 浏览器:如果没有则创建新的查询客户端
// 这一点非常重要,可以避免 React 在初始渲染挂起时丢弃客户端
// 如果在创建查询客户端下方有 suspense 边界,可能就不需要这样
if (!browserQueryClient) browserQueryClient = makeQueryClient()
return browserQueryClient
}
}
export function Providers(props: { children: React.ReactNode }) {
// 注意:如果在此处和可能挂起的代码之间没有 suspense 边界,
// 则避免在初始化查询客户端时使用 useState,因为 React 可能会在
// 初始渲染挂起时丢弃客户端
const queryClient = getQueryClient()
return (
<QueryClientProvider client={queryClient}>
<ReactQueryStreamedHydration>
{props.children}
</ReactQueryStreamedHydration>
</QueryClientProvider>
)
}