You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中useQuery开启suspense:true引发无限循环问题

Next.js中React Query Suspense引发无限循环的原因

在Next.js里使用React Query的Suspense功能时,在_app文件的QueryClient配置中添加suspense: true后,index.tsx里通过useQuery发起的请求出现了无限循环。

相关代码如下:

_app文件代码

const queryClient = new QueryClient({
    defaultOptions: {
      queries: { staleTime: Infinity, retry: 0, suspense: true },
    },
  })

index.tsx文件代码

const { data: categories } = useQuery<categories[]>(['categories'], () =>
    fetch(`${server}/api/get-categories`)
      .then((res) => res.json())
      .then((data) => data.items),
  )

问题原因

问题出在你每次渲染_app组件时都会创建全新的QueryClient实例,没有复用同一个实例。

开启suspense: true后,每次组件渲染时,新的QueryClient没有缓存之前请求的数据,useQuery会判定数据未就绪,触发Suspense机制挂起组件;组件挂起恢复后会再次渲染,此时又会创建新的QueryClient,useQuery再次发起请求并触发Suspense,如此往复形成无限循环。

修复思路

要解决这个问题,需保证QueryClient实例只初始化一次并复用:

  • 客户端环境下,可以用useMemo缓存QueryClient实例,避免每次渲染重新创建
  • SSR/SSG场景下,需为每个请求创建独立的QueryClient,但要确保在当前请求的生命周期内复用该实例

内容的提问来源于stack exchange,提问作者Donghyun Kang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:45:42