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)
})
})
}