diff --git a/packages/solid-query/src/__tests__/suspense.test.tsx b/packages/solid-query/src/__tests__/suspense.test.tsx index 8fbb86e9f3..ae57eabbf4 100644 --- a/packages/solid-query/src/__tests__/suspense.test.tsx +++ b/packages/solid-query/src/__tests__/suspense.test.tsx @@ -951,4 +951,76 @@ describe("useQuery's in Suspense mode", () => { expect(renders).toBe(2) expect(rendered.queryByText('rendered')).toBeInTheDocument() }) + + it('should not trigger suspense when setQueryData is called with pre-cached data and refetchOnMount: false', async () => { + const key = queryKey() + let suspenseCount = 0 + + const localQueryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnMount: false, + }, + }, + }) + + localQueryClient.setQueryData(key, { likes: 42 }) + + function Loading() { + suspenseCount++ + return
loading
+ } + + function Example() { + const query = useQuery(() => ({ + queryKey: key, + queryFn: () => Promise.resolve({ likes: 42 }), + })) + + const mutate = () => { + const old = localQueryClient.getQueryData(key) as { likes: number } + localQueryClient.setQueryData(key, { + ...old, + likes: old.likes + 1, + }) + } + + return ( +
+ {query.data?.likes} + +
+ ) + } + + const rendered = render(() => ( + + }> + + + + )) + + await vi.advanceTimersByTimeAsync(0) + + // Initial render should show cached data without triggering suspense + expect(rendered.getByTestId('likes').textContent).toBe('42') + expect(suspenseCount).toBe(0) + + // First mutation + fireEvent.click(rendered.getByTestId('mutate')) + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByTestId('likes').textContent).toBe('43') + expect(suspenseCount).toBe(0) + + // Second mutation + fireEvent.click(rendered.getByTestId('mutate')) + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByTestId('likes').textContent).toBe('44') + + // Suspense should never trigger when data is already cached + expect(suspenseCount).toBe(0) + }) }) diff --git a/packages/solid-query/src/useBaseQuery.ts b/packages/solid-query/src/useBaseQuery.ts index 773d0719e0..01321699bd 100644 --- a/packages/solid-query/src/useBaseQuery.ts +++ b/packages/solid-query/src/useBaseQuery.ts @@ -260,7 +260,8 @@ export function useBaseQuery< setStateWithReconciliation(observerResult) return reject(observerResult.error) } - if (!observerResult.isLoading) { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- data can be undefined at runtime despite type inference + if (!observerResult.isLoading || observerResult.data !== undefined) { resolver = null return resolve( hydratableObserverResult(obs.getCurrentQuery(), observerResult), @@ -376,9 +377,16 @@ export function useBaseQuery< prop: keyof QueryObserverResult, ): any { if (prop === 'data') { - if (state.data !== undefined) { - return queryResource.latest?.data + const stateData = state.data + + if (!observerResult.isFetching && stateData !== undefined) { + return stateData + } + + if (!observerResult.isFetching && observerResult.data !== undefined) { + return observerResult.data } + return queryResource()?.data } return Reflect.get(target, prop)