function queryOptions<TQueryFnData, TError, TData, TQueryKey>(options): DefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>;Defined in: vue-query/src/queryOptions.ts:168
You can generally pass everything to queryOptions that you can also pass to useQuery. These options can be shared across hooks and imperative APIs such as queryClient.query. options.queryKey is required and is the query key to generate options for.
This overload is selected when initialData is set, so the resulting data is never undefined.
TQueryFnData = unknown
TError = Error
TData = TQueryFnData
TQueryKey extends readonly unknown[] = readonly unknown[]
DefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey>
The DefinedInitialQueryOptions to use — everything you can pass to useQuery, with initialData set.
DefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>
The same options object, typed so that queryKey carries the inferred data type.
useQuery to run a query with these options.
<script setup lang="ts">
import { queryOptions, useQuery } from '@tanstack/vue-query'
const postsOptions = queryOptions({
queryKey: ['posts'],
queryFn: fetchPosts,
initialData: [],
})
// `data` is `Post[]`, never `undefined`, thanks to `initialData` — even if a refetch fails,
// so the list stays visible alongside the error.
const { data, isError, error } = useQuery(postsOptions)
</script>function queryOptions<TQueryFnData, TError, TData, TQueryKey>(options): () => DefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>;Defined in: vue-query/src/queryOptions.ts:205
Same as the plain-object overload, but for options that close over reactive state (refs read inside the function body). Wrap them in a getter so queryClient methods like invalidateQueries/fetchQuery always read the current values instead of the ones captured when the options were created.
TQueryFnData = unknown
TError = Error
TData = TQueryFnData
TQueryKey extends readonly unknown[] = readonly unknown[]
() => DefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey>
A function returning the DefinedInitialQueryOptions to use, re-evaluated on demand.
A function that returns the same options object, typed so that queryKey carries the inferred data type.
(): DefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>;DefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>
useQuery to run a query with these options.
<script setup lang="ts">
import { ref } from 'vue'
import { queryOptions, useQuery } from '@tanstack/vue-query'
const postId = ref(1)
const postOptions = queryOptions(() => ({
queryKey: ['post', postId.value],
queryFn: () => fetchPost(postId.value),
initialData: { id: postId.value, title: '' },
}))
// Pass the getter itself, not `postOptions()`, so the query keeps reacting to `postId` changes.
const { data } = useQuery(postOptions)
</script>function queryOptions<TQueryFnData, TError, TData, TQueryKey>(options): UndefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>;Defined in: vue-query/src/queryOptions.ts:250
You can generally pass everything to queryOptions that you can also pass to useQuery. These options can be shared across hooks and imperative APIs such as queryClient.query. options.queryKey is required and is the query key to generate options for.
TQueryFnData = unknown
TError = Error
TData = TQueryFnData
TQueryKey extends readonly unknown[] = readonly unknown[]
UndefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey>
The UndefinedInitialQueryOptions to use — everything you can pass to useQuery.
UndefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>
The same options object, typed so that queryKey carries the inferred data type.
useQuery to run a query with these options.
A parameterized factory, so the same options object can be reused per id:
<script setup lang="ts">
import { queryOptions, useQuery } from '@tanstack/vue-query'
function postOptions(id: string) {
return queryOptions({
queryKey: ['post', id],
queryFn: () => fetchPost(id),
})
}
const { data, isPending, isError, error } = useQuery(postOptions('1'))
</script>function queryOptions<TQueryFnData, TError, TData, TQueryKey>(options): () => UndefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>;Defined in: vue-query/src/queryOptions.ts:316
Same as the plain-object overload, but for options that close over reactive state (refs read inside the function body). Wrap them in a getter so the queryKey — and anything else derived from a ref — reacts to changes, and so queryClient methods like invalidateQueries/fetchQuery always read the current values instead of the ones captured when the options were created.
TQueryFnData = unknown
TError = Error
TData = TQueryFnData
TQueryKey extends readonly unknown[] = readonly unknown[]
() => UndefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey>
A function returning the UndefinedInitialQueryOptions to use, re-evaluated on demand.
A function that returns the same options object, typed so that queryKey carries the inferred data type.
(): UndefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>;UndefinedInitialQueryOptionsWithDataTag<TQueryFnData, TError, TData, TQueryKey>
useQuery to run a query with these options.
<script setup lang="ts">
import { ref } from 'vue'
import { queryOptions, useQuery, useQueryClient } from '@tanstack/vue-query'
const postId = ref(1)
const postOptions = queryOptions(() => ({
queryKey: ['post', postId.value],
queryFn: () => fetchPost(postId.value),
}))
// Pass the getter itself, not `postOptions()`, so the query keeps reacting to `postId` changes.
const { data } = useQuery(postOptions)
const queryClient = useQueryClient()
// Here, call `postOptions()` so `invalidateQueries` reads the current `queryKey` right away.
queryClient.invalidateQueries(postOptions())
</script>A parameterized factory that disables the query, type safe, until postId is set. This requires a whole-options getter: queryFn is a single value, not queryKey/enabled, so it isn't itself reactive — the getter is what re-evaluates it on every change to postId:
<script setup lang="ts">
import { queryOptions, skipToken, useQuery } from '@tanstack/vue-query'
function postOptions(postId: number | undefined) {
return queryOptions(() => ({
queryKey: ['post', postId],
queryFn: postId != null ? () => fetchPost(postId) : skipToken,
}))
}
const props = defineProps<{ postId: number | undefined }>()
const { data, isLoading, isError, error } = useQuery(postOptions(props.postId))
</script>