Skip to content

Commit 700d854

Browse files
committed
fix(react-query): keep unsubscribed useQueries idle
1 parent 9d24c45 commit 700d854

3 files changed

Lines changed: 39 additions & 3 deletions

File tree

.changeset/tidy-pandas-wait.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@tanstack/react-query': patch
3+
---
4+
5+
fix(react-query): don't show optimistic fetching for unsubscribed useQueries

packages/react-query/src/__tests__/useQueries.test.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,34 @@ describe('useQueries', () => {
6363
expect(results[2]).toMatchObject([{ data: 1 }, { data: 2 }])
6464
})
6565

66+
it('should not optimistically show fetching when unsubscribed', () => {
67+
const key = queryKey()
68+
const queryFn = vi.fn(() => Promise.resolve('data'))
69+
70+
function Page() {
71+
const [query] = useQueries({
72+
queries: [{ queryKey: key, queryFn }],
73+
subscribed: false,
74+
})
75+
76+
return (
77+
<div>
78+
<span>isFetching: {String(query.isFetching)}</span>
79+
<span>fetchStatus: {query.fetchStatus}</span>
80+
</div>
81+
)
82+
}
83+
84+
const rendered = renderWithClient(queryClient, <Page />)
85+
86+
expect(queryFn).not.toHaveBeenCalled()
87+
expect(
88+
queryClient.getQueryCache().find({ queryKey: key })!.observers.length,
89+
).toBe(0)
90+
rendered.getByText('isFetching: false')
91+
rendered.getByText('fetchStatus: idle')
92+
})
93+
6694
it('should track results', async () => {
6795
const key1 = queryKey()
6896
const results: Array<Array<UseQueryResult>> = []

packages/react-query/src/useQueries.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ export function useQueries<
223223
const client = useQueryClient(queryClient)
224224
const isRestoring = useIsRestoring()
225225
const errorResetBoundary = useQueryErrorResetBoundary()
226+
const subscribed = options.subscribed !== false
226227

227228
const defaultedQueries = React.useMemo(
228229
() =>
@@ -234,11 +235,13 @@ export function useQueries<
234235
// Make sure the results are already in fetching state before subscribing or updating options
235236
defaultedOptions._optimisticResults = isRestoring
236237
? 'isRestoring'
237-
: 'optimistic'
238+
: subscribed
239+
? 'optimistic'
240+
: undefined
238241

239242
return defaultedOptions
240243
}),
241-
[queries, client, isRestoring],
244+
[queries, client, isRestoring, subscribed],
242245
)
243246

244247
defaultedQueries.forEach((queryOptions) => {
@@ -265,7 +268,7 @@ export function useQueries<
265268
(options as QueriesObserverOptions<TCombinedResult>).combine,
266269
)
267270

268-
const shouldSubscribe = !isRestoring && options.subscribed !== false
271+
const shouldSubscribe = !isRestoring && subscribed
269272
React.useSyncExternalStore(
270273
React.useCallback(
271274
(onStoreChange) =>

0 commit comments

Comments
 (0)