--- id: useQuery title: useQuery redirect_from: - framework/solid/reference/useQuery --- ## Call Signature ```ts function useQuery(options, queryClient?): UseQueryResult; ``` Defined in: [packages/solid-query/src/useQuery.ts:178](https://github.com/TanStack/query/blob/main/packages/solid-query/src/useQuery.ts#L178) ### Type Parameters #### TQueryFnData `TQueryFnData` = `unknown` #### TError `TError` = `Error` #### TData `TData` = `TQueryFnData` #### TQueryKey `TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[] ### Parameters #### options [`UndefinedInitialDataOptions`](../type-aliases/UndefinedInitialDataOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\> An accessor returning the [UndefinedInitialDataOptions](../type-aliases/UndefinedInitialDataOptions.md) to use — everything you can pass to `useQuery`. #### queryClient? () => [`QueryClient`](../classes/QueryClient.md) An accessor for a custom `QueryClient`. Otherwise, the one from the nearest context will be used. ### Returns [`UseQueryResult`](../type-aliases/UseQueryResult.md)\<`TData`, `TError`\> The current query result, as a Solid store. `status` is `pending` if there is no cached data to display, `error` if the last fetch attempt failed, or `success` if the query has data to display. `isPending`/`isSuccess`/`isError` are derived booleans for convenience. ### See [queryOptions](queryOptions.md) to share these options between `useQuery` and imperative APIs like `queryClient.query`. ### Examples ```tsx import { For, Match, Switch } from 'solid-js' import { useQuery } from '@tanstack/solid-query' function Posts() { const postsQuery = useQuery(() => ({ queryKey: ['posts'], queryFn: fetchPosts, })) return ( Loading... Error: {postsQuery.error.message}
    {(post) =>
  • {post.title}
  • }
{postsQuery.isFetching ? 'Background Updating...' : ' '}
) } ``` `select` derives whatever `data` a component needs from the cached value, without changing what's actually stored in the cache — the cache still holds the full `Post[]`, but `data` here is a `number`: ```tsx import { Match, Switch } from 'solid-js' import { useQuery } from '@tanstack/solid-query' function PostCount() { const postsQuery = useQuery(() => ({ queryKey: ['posts'], queryFn: fetchPosts, select: (posts) => posts.length, })) return ( Loading... Error: {postsQuery.error.message} {postsQuery.data} posts ) } ``` A dependent query, only enabled once `postId` is set: ```tsx import { Match, Switch } from 'solid-js' import { useQuery } from '@tanstack/solid-query' function Post(props: { postId: number | undefined }) { const postQuery = useQuery(() => ({ queryKey: ['post', props.postId], queryFn: () => fetchPost(props.postId!), enabled: props.postId != null, })) return ( {postQuery.data?.title}}> Select a post Loading... Error: {postQuery.error.message} ) } ``` The same dependent query, using `skipToken` to disable it in a type-safe way instead of relying on `enabled`. The non-null assertion is still needed — Solid's `props` narrowing doesn't survive into the `queryFn` closure the way a local `const` would — but `skipToken` keeps `queryFn`'s return type accurate without it. `refetch` doesn't work while `queryFn` is `skipToken` — use `enabled: false` instead if you need to trigger the query manually: ```tsx import { Match, Switch } from 'solid-js' import { skipToken, useQuery } from '@tanstack/solid-query' function Post(props: { postId: number | undefined }) { const postQuery = useQuery(() => ({ queryKey: ['post', props.postId], queryFn: props.postId != null ? () => fetchPost(props.postId!) : skipToken, })) return ( {postQuery.data?.title}}> Select a post Loading... Error: {postQuery.error.message} ) } ``` Seeding a detail query from an already-cached list, to skip the loading state: ```tsx import { useQuery, useQueryClient } from '@tanstack/solid-query' function Post(props: { postId: number }) { const queryClient = useQueryClient() const postQuery = useQuery(() => ({ queryKey: ['post', props.postId], queryFn: () => fetchPost(props.postId), initialData: () => queryClient .getQueryData>(['posts']) ?.find((post) => post.id === props.postId), })) return postQuery.isError ? Error: {postQuery.error.message} :

{postQuery.data?.title}

} ``` Paginated data, keeping the previous page's data visible while the next page loads: ```tsx import { For, createSignal } from 'solid-js' import { keepPreviousData, useQuery } from '@tanstack/solid-query' function Posts() { const [page, setPage] = createSignal(0) const postsQuery = useQuery(() => ({ queryKey: ['posts', page()], queryFn: () => fetchPosts(page()), placeholderData: keepPreviousData, })) return (
    {(post) =>
  • {post.title}
  • }
) } ``` ## Call Signature ```ts function useQuery(options, queryClient?): DefinedUseQueryResult; ``` Defined in: [packages/solid-query/src/useQuery.ts:226](https://github.com/TanStack/query/blob/main/packages/solid-query/src/useQuery.ts#L226) This overload is selected when `initialData` is set, so the resulting `data` is never `undefined`. ### Type Parameters #### TQueryFnData `TQueryFnData` = `unknown` #### TError `TError` = `Error` #### TData `TData` = `TQueryFnData` #### TQueryKey `TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[] ### Parameters #### options [`DefinedInitialDataOptions`](../type-aliases/DefinedInitialDataOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\> An accessor returning the [DefinedInitialDataOptions](../type-aliases/DefinedInitialDataOptions.md) to use — everything you can pass to `useQuery`, with `initialData` set. #### queryClient? () => [`QueryClient`](../classes/QueryClient.md) An accessor for a custom `QueryClient`. Otherwise, the one from the nearest context will be used. ### Returns [`DefinedUseQueryResult`](../type-aliases/DefinedUseQueryResult.md)\<`TData`, `TError`\> The current query result, as a Solid store, typed so that `status` is `success` — or `error` if a fetch attempt fails while keeping the existing data (`status` never resolves to `pending` in this overload's type, since `initialData` guarantees data upfront). `isSuccess`/`isError` are derived booleans for convenience. ### See [queryOptions](queryOptions.md) to share these options between `useQuery` and imperative APIs like `queryClient.query`. ### Example ```tsx import { For } from 'solid-js' import { useQuery } from '@tanstack/solid-query' function Posts() { // `postsQuery.data` is never `undefined`, thanks to `initialData` — even if a refetch fails, so the // list stays visible alongside the error. const postsQuery = useQuery(() => ({ queryKey: ['posts'], queryFn: fetchPosts, initialData: [], })) return (
{postsQuery.isError ? Error: {postsQuery.error.message} : null}
    {(post) =>
  • {post.title}
  • }
) } ```