diff --git a/.changeset/thick-cloths-lie.md b/.changeset/thick-cloths-lie.md
new file mode 100644
index 00000000000..c0b2cd3a7a4
--- /dev/null
+++ b/.changeset/thick-cloths-lie.md
@@ -0,0 +1,5 @@
+---
+'@tanstack/solid-query': minor
+---
+
+feat(solid-query/useQueries): add Suspense support
diff --git a/packages/solid-query/src/__tests__/suspense.test.tsx b/packages/solid-query/src/__tests__/suspense.test.tsx
index 8fbb86e9f3b..426b9f42993 100644
--- a/packages/solid-query/src/__tests__/suspense.test.tsx
+++ b/packages/solid-query/src/__tests__/suspense.test.tsx
@@ -9,11 +9,13 @@ import {
on,
} from 'solid-js'
import { queryKey, sleep } from '@tanstack/query-test-utils'
+import { onlineManager } from '@tanstack/query-core'
import {
QueryCache,
QueryClient,
QueryClientProvider,
useInfiniteQuery,
+ useQueries,
useQuery,
} from '..'
import type { InfiniteData, UseInfiniteQueryResult, UseQueryResult } from '..'
@@ -952,3 +954,1074 @@ describe("useQuery's in Suspense mode", () => {
expect(rendered.queryByText('rendered')).toBeInTheDocument()
})
})
+
+describe("useQueries's in Suspense mode", () => {
+ beforeEach(() => {
+ vi.useFakeTimers()
+ })
+
+ afterEach(() => {
+ vi.useRealTimers()
+ })
+
+ const queryCache = new QueryCache()
+ const queryClient = new QueryClient({ queryCache })
+
+ it('should suspend when data is accessed in JSX', async () => {
+ const key1 = queryKey()
+ const key2 = queryKey()
+
+ function Page() {
+ const queries = useQueries(() => ({
+ queries: [
+ {
+ queryKey: key1,
+ queryFn: () => sleep(10).then(() => 'data1'),
+ },
+ {
+ queryKey: key2,
+ queryFn: () => sleep(20).then(() => 'data2'),
+ },
+ ],
+ }))
+
+ return (
+
+ data1: {String(queries[0].data)} data2: {String(queries[1].data)}
+
+ )
+ }
+
+ const rendered = render(() => (
+
+
+
+
+
+ ))
+
+ expect(rendered.getByText('loading')).toBeInTheDocument()
+ await vi.advanceTimersByTimeAsync(10)
+ expect(rendered.getByText('loading')).toBeInTheDocument()
+ await vi.advanceTimersByTimeAsync(10)
+ expect(rendered.getByText('data1: data1 data2: data2')).toBeInTheDocument()
+ })
+
+ it('should not call the queryFn twice when used in Suspense mode', async () => {
+ const key = queryKey()
+
+ const queryFn = vi.fn(() => sleep(10).then(() => 'data'))
+
+ function Page() {
+ const queries = useQueries(() => ({
+ queries: [
+ {
+ queryKey: [key],
+ queryFn,
+ },
+ ],
+ }))
+
+ return data: {String(queries[0].data)}
+ }
+
+ const rendered = render(() => (
+
+
+
+
+
+ ))
+
+ expect(rendered.getByText('loading')).toBeInTheDocument()
+ await vi.advanceTimersByTimeAsync(10)
+ expect(rendered.getByText('data: data')).toBeInTheDocument()
+ expect(queryFn).toHaveBeenCalledTimes(1)
+ })
+
+ it('should remove query instance when component unmounted', async () => {
+ const key = queryKey()
+
+ function Page() {
+ const queries = useQueries(() => ({
+ queries: [
+ {
+ queryKey: key,
+ queryFn: () => sleep(10).then(() => 'data'),
+ },
+ ],
+ }))
+
+ return data: {String(queries[0].data)}
+ }
+
+ function App() {
+ const [show, setShow] = createSignal(false)
+
+ return (
+ <>
+ {show() && }
+