Skip to content

Commit f0d32ca

Browse files
committed
fix: make sure suspense is always triggered when loading a query
1 parent 360d38c commit f0d32ca

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

src/react/tests/suspense.test.tsx

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,56 @@ describe("useQuery's in Suspense mode", () => {
333333
await waitFor(() => rendered.getByText('fetching: false'))
334334
})
335335

336+
it('should suspend when switching to a new query', async () => {
337+
const key1 = queryKey()
338+
const key2 = queryKey()
339+
340+
function Component(props: { queryKey: string }) {
341+
const result = useQuery(
342+
props.queryKey,
343+
async () => {
344+
await sleep(100)
345+
return props.queryKey
346+
},
347+
{
348+
retry: false,
349+
suspense: true,
350+
}
351+
)
352+
return <div>data: {result.data}</div>
353+
}
354+
355+
function Page() {
356+
const [key, setKey] = React.useState(key1)
357+
return (
358+
<div>
359+
<button
360+
onClick={() => {
361+
setKey(key2)
362+
}}
363+
>
364+
switch
365+
</button>
366+
<React.Suspense fallback="Loading...">
367+
<Component queryKey={key} />
368+
</React.Suspense>
369+
</div>
370+
)
371+
}
372+
373+
const rendered = renderWithClient(queryClient, <Page />)
374+
375+
await waitFor(() => rendered.getByText('Loading...'))
376+
await waitFor(() => rendered.getByText(`data: ${key1}`))
377+
fireEvent.click(rendered.getByText('switch'))
378+
await waitFor(() => rendered.getByText('Loading...'))
379+
await waitFor(() => rendered.getByText(`data: ${key2}`))
380+
expect(
381+
// @ts-expect-error
382+
queryClient.getQueryCache().find(key2)!.observers[0].listeners.length
383+
).toBe(1)
384+
})
385+
336386
it('should retry fetch if the reset error boundary has been reset with global hook', async () => {
337387
const key = queryKey()
338388

src/react/useBaseQuery.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,7 @@ export function useBaseQuery<TData, TError, TQueryFnData, TQueryData>(
7373
throw currentResult.error
7474
}
7575

76-
if (
77-
observer.options.suspense &&
78-
!observer.hasListeners() &&
79-
observer.willLoadOnMount()
80-
) {
76+
if (observer.options.suspense && currentResult.isLoading) {
8177
errorResetBoundary.clearReset()
8278
const unsubscribe = observer.subscribe()
8379
throw observer.refetch().finally(unsubscribe)

0 commit comments

Comments
 (0)