diff --git a/packages/solid-query/src/__tests__/suspense.test.tsx b/packages/solid-query/src/__tests__/suspense.test.tsx index f3ba1b5486..deb7bf0938 100644 --- a/packages/solid-query/src/__tests__/suspense.test.tsx +++ b/packages/solid-query/src/__tests__/suspense.test.tsx @@ -167,6 +167,67 @@ describe("useQuery's in Suspense mode", () => { expect(queryFn).toHaveBeenCalledTimes(1) }) + it('should not re-suspend a cache-warm query when it only becomes stale', async () => { + const key = queryKey() + queryClient.setQueryData(key, 'cached') + + const fallbackMounts: number[] = [] + const removals: number[] = [] + + function Fallback() { + fallbackMounts.push(Date.now()) + return
loading
+ } + + function Page() { + const state = useQuery(() => ({ + queryKey: key, + queryFn: () => Promise.resolve('fresh'), + staleTime: 1000, + })) + + return ( +
+ {state.data} + +
+ ) + } + + const rendered = renderWithClient(queryClient, () => ( + }> + + + )) + + await Promise.resolve() + await Promise.resolve() + + const root = rendered.getByTestId('root') + const baselineFallbackMounts = fallbackMounts.length + const observer = new MutationObserver((records) => { + for (const record of records) { + removals.push(record.removedNodes.length) + } + }) + observer.observe(root.parentElement!, { childList: true }) + + const input = rendered.getByTestId('input') as HTMLInputElement + input.focus() + expect(document.activeElement).toBe(input) + + await vi.advanceTimersByTimeAsync(1001) + await Promise.resolve() + await Promise.resolve() + + expect(rendered.queryByTestId('fallback')).toBeNull() + expect(document.activeElement).toBe(input) + expect(removals.reduce((sum, count) => sum + count, 0)).toBe(0) + expect(fallbackMounts.length).toBe(baselineFallbackMounts) + + observer.disconnect() + }) + it('should remove query instance when component unmounted', async () => { const key = queryKey() diff --git a/packages/solid-query/src/useBaseQuery.ts b/packages/solid-query/src/useBaseQuery.ts index 773d0719e0..4368878ae1 100644 --- a/packages/solid-query/src/useBaseQuery.ts +++ b/packages/solid-query/src/useBaseQuery.ts @@ -182,9 +182,16 @@ export function useBaseQuery< return obs.subscribe((result) => { observerResult = result queueMicrotask(() => { - if (unsubscribe) { + if (!unsubscribe) { + return + } + + if (resolver || result.isLoading || result.isError) { refetch() + return } + + setStateWithReconciliation(result) }) }) }