From 567736cfdcdd04c339731a37c1d2e78b6f67114f Mon Sep 17 00:00:00 2001 From: Huang Jingzhan Date: Sun, 25 Feb 2024 17:05:34 +0800 Subject: [PATCH] fix(react-query): remove placeholderData from suspense query --- .../src/__tests__/suspense.test.tsx | 102 ++++++++++++++++++ .../react-query/src/useSuspenseQueries.ts | 1 + packages/react-query/src/useSuspenseQuery.ts | 1 + 3 files changed, 104 insertions(+) diff --git a/packages/react-query/src/__tests__/suspense.test.tsx b/packages/react-query/src/__tests__/suspense.test.tsx index af5c54b3227..64b1b91fb3e 100644 --- a/packages/react-query/src/__tests__/suspense.test.tsx +++ b/packages/react-query/src/__tests__/suspense.test.tsx @@ -779,6 +779,58 @@ describe('useSuspenseQuery', () => { consoleMock.mockRestore() }) + + it('should still suspense if queryClient has placeholderData config', async () => { + const key = queryKey() + const queryClientWithPlaceholder = createQueryClient({ + defaultOptions: { + queries: { + placeholderData: (previousData: any) => previousData, + }, + }, + }) + const states: Array> = [] + + let count = 0 + let renders = 0 + + function Page() { + renders++ + + const [stateKey, setStateKey] = React.useState(key) + + const state = useSuspenseQuery({ + queryKey: stateKey, + queryFn: async () => { + count++ + await sleep(100) + return count + }, + }) + + states.push(state) + + return ( +
+
+ ) + } + + const rendered = renderWithClient( + queryClientWithPlaceholder, + + + , + ) + await waitFor(() => rendered.getByText('loading')) + await waitFor(() => rendered.getByText('data: 1')) + fireEvent.click(rendered.getByLabelText('toggle')) + + await waitFor(() => rendered.getByText('loading')) + await waitFor(() => rendered.getByText('data: 2')) + }) }) describe('useSuspenseQueries', () => { @@ -1090,4 +1142,54 @@ describe('useSuspenseQueries', () => { expect(queryFnCount).toBe(2) }) + + it('should still suspense if queryClient has placeholderData config', async () => { + const key = queryKey() + const queryClientWithPlaceholder = createQueryClient({ + defaultOptions: { + queries: { + placeholderData: (previousData: any) => previousData, + }, + }, + }) + + function Page() { + const [count, setCount] = React.useState(0) + const [isPending, startTransition] = React.useTransition() + const { data } = useSuspenseQuery({ + queryKey: [key, count], + queryFn: async () => { + await sleep(10) + return 'data' + count + }, + }) + + return ( +
+ + +
{isPending ? 'Pending...' : String(data)}
+
+ ) + } + + const rendered = renderWithClient( + queryClientWithPlaceholder, + + + , + ) + + await waitFor(() => rendered.getByText('Loading...')) + + await waitFor(() => rendered.getByText('data0')) + + fireEvent.click(rendered.getByText('inc')) + + await waitFor(() => rendered.getByText('Pending...')) + + await waitFor(() => rendered.getByText('data1')) + }) }) diff --git a/packages/react-query/src/useSuspenseQueries.ts b/packages/react-query/src/useSuspenseQueries.ts index ead3dd35dad..1d58da0c533 100644 --- a/packages/react-query/src/useSuspenseQueries.ts +++ b/packages/react-query/src/useSuspenseQueries.ts @@ -187,6 +187,7 @@ export function useSuspenseQueries< suspense: true, throwOnError: defaultThrowOnError, enabled: true, + placeholderData: undefined, })), } as any, queryClient, diff --git a/packages/react-query/src/useSuspenseQuery.ts b/packages/react-query/src/useSuspenseQuery.ts index 179f58392aa..3bf6039d016 100644 --- a/packages/react-query/src/useSuspenseQuery.ts +++ b/packages/react-query/src/useSuspenseQuery.ts @@ -20,6 +20,7 @@ export function useSuspenseQuery< enabled: true, suspense: true, throwOnError: defaultThrowOnError, + placeholderData: undefined, }, QueryObserver, queryClient,