-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Closed as not planned
Closed as not planned
Copy link
Labels
Description
Describe the bug
Using queryClient.clear() with suspense enabled causes an infinite loop. We encountered this in Blitz on user logout: blitz-js/blitz#2249
To Reproduce
Add the following to src/react/tests/suspense.test.tsx
it('should render error boundary when query goes from success to fail with clear()', async () => {
const key = queryKey()
let succeed = true
const consoleMock = mockConsoleError()
function Page() {
useQuery(
key,
async () => {
console.log('query')
await sleep(10)
if (!succeed) {
throw new Error('Suspense Error Bingo')
} else {
return 'data'
}
},
{
retry: false,
suspense: true,
}
)
return <div>rendered</div>
}
function App() {
const { reset } = useQueryErrorResetBoundary()
return (
<ErrorBoundary
onReset={reset}
fallbackRender={({ resetErrorBoundary }) => (
<div>
<div>error boundary</div>
<button
onClick={() => {
resetErrorBoundary()
}}
>
retry
</button>
</div>
)}
>
<React.Suspense fallback="Loading...">
<Page />
</React.Suspense>
</ErrorBoundary>
)
}
const rendered = renderWithClient(queryClient, <App />)
await waitFor(() => rendered.getByText('Loading...'))
await waitFor(() => rendered.getByText('rendered'))
succeed = false
queryClient.clear()
await waitFor(() => rendered.getByText('error boundary'))
consoleMock.mockRestore()
})Expected behavior
Should Work
Additional context
React-query 3.13.9
Workaround
-queryClient.clear()
+await queryClient.cancelQueries()
+await queryClient.resetQueries()
+queryClient.getMutationCache().clear()