5月30日 00:37

React Query 如何与 Suspense 集成?错误边界怎么处理?

React Query 接入 Suspense 后,加载状态交给 Suspense fallback,错误交给 Error Boundary。实际项目里优先用 useSuspenseQuery,而不是在每个组件里判断 isLoading。注意:开启 Suspense 不代表不用管错误,网络失败会抛给最近的错误边界;如果要让“重试”按钮生效,还要配 QueryErrorResetBoundary。

追问

useSuspenseQuery 和 useQuery 有什么区别?

useSuspenseQuery 成功返回时 data 一定有值,加载中会挂起组件。你少写了 loading 分支,但必须准备好 Suspense 和错误边界。

Error Boundary 应该放在哪里?

放在页面块级别通常最合适。太外层会导致整页白掉,太内层又会让错误处理重复。

有缓存时还会进入 fallback 吗?

已有可用缓存时通常直接渲染;queryKey 改变触发新请求时,可能再次 fallback。交互更新可用 startTransition 降低界面闪烁。

SSR 里能直接用吗?

要谨慎。Next.js 等场景通常配合预取、dehydrate/hydrate,或使用框架推荐的 Suspense 数据方案。

写段代码

tsx
<QueryErrorResetBoundary> {({ reset }) => ( <ErrorBoundary onReset={reset} fallbackRender={({ resetErrorBoundary }) => ( <button onClick={resetErrorBoundary}>重试</button> )}> <Suspense fallback={<Spinner />}> <UserPanel /> </Suspense> </ErrorBoundary> )} </QueryErrorResetBoundary>
标签:React