diff --git a/.changeset/soft-cats-drum.md b/.changeset/soft-cats-drum.md
new file mode 100644
index 00000000000..d35e7d54359
--- /dev/null
+++ b/.changeset/soft-cats-drum.md
@@ -0,0 +1,5 @@
+---
+'@tanstack/preact-query': patch
+---
+
+fix(preact-query/useQueries): keep unsubscribed idle
diff --git a/packages/preact-query/src/__tests__/useQueries.test.tsx b/packages/preact-query/src/__tests__/useQueries.test.tsx
index b4ee5e69869..b277dcc5bd9 100644
--- a/packages/preact-query/src/__tests__/useQueries.test.tsx
+++ b/packages/preact-query/src/__tests__/useQueries.test.tsx
@@ -64,6 +64,34 @@ describe('useQueries', () => {
expect(results[2]).toMatchObject([{ data: 1 }, { data: 2 }])
})
+ it('should not optimistically show fetching when unsubscribed', () => {
+ const key = queryKey()
+ const queryFn = vi.fn(() => Promise.resolve('data'))
+
+ function Page() {
+ const [query] = useQueries({
+ queries: [{ queryKey: key, queryFn }],
+ subscribed: false,
+ })
+
+ return (
+
+ isFetching: {String(query.isFetching)}
+ fetchStatus: {query.fetchStatus}
+
+ )
+ }
+
+ const rendered = renderWithClient(queryClient, )
+
+ expect(queryFn).not.toHaveBeenCalled()
+ expect(
+ queryClient.getQueryCache().find({ queryKey: key })!.observers.length,
+ ).toBe(0)
+ rendered.getByText('isFetching: false')
+ rendered.getByText('fetchStatus: idle')
+ })
+
it('should track results', async () => {
const key1 = queryKey()
const results: Array> = []
diff --git a/packages/preact-query/src/useQueries.ts b/packages/preact-query/src/useQueries.ts
index b0ed8b0b806..c47e5a91b32 100644
--- a/packages/preact-query/src/useQueries.ts
+++ b/packages/preact-query/src/useQueries.ts
@@ -306,6 +306,7 @@ export function useQueries<
const client = useQueryClient(queryClient)
const isRestoring = useIsRestoring()
const errorResetBoundary = useQueryErrorResetBoundary()
+ const subscribed = options.subscribed !== false
const defaultedQueries = useMemo(
() =>
@@ -317,11 +318,13 @@ export function useQueries<
// Make sure the results are already in fetching state before subscribing or updating options
defaultedOptions._optimisticResults = isRestoring
? 'isRestoring'
- : 'optimistic'
+ : subscribed
+ ? 'optimistic'
+ : undefined
return defaultedOptions
}),
- [queries, client, isRestoring],
+ [queries, client, isRestoring, subscribed],
)
defaultedQueries.forEach((queryOptions) => {
@@ -348,7 +351,7 @@ export function useQueries<
(options as QueriesObserverOptions).combine,
)
- const shouldSubscribe = !isRestoring && options.subscribed !== false
+ const shouldSubscribe = !isRestoring && subscribed
useSyncExternalStore(
useCallback(
(onStoreChange) =>