-
-
Notifications
You must be signed in to change notification settings - Fork 245
Open
Labels
bug π₯Something isn't workingSomething isn't workingfeature πNew feature or requestNew feature or request
Description
Description
The @tanstack/vue-query
plugin generates query option functions that don't support Vue 3's reactivity system. Generated functions accept static Options
parameters instead of reactive values (MaybeRefOrGetter
), which prevents queries from automatically refetching when reactive dependencies change.
Current problematic behavior:
const userId = ref('user123')
const searchQuery = ref('john')
const { data } = useQuery({
...getUsersOptions({
path: { id: userId.value }, // β .value loses reactivity
query: { search: searchQuery.value }, // β .value loses reactivity
}),
})
// These changes don't trigger refetch:
userId.value = 'user456' // No refetch
searchQuery.value = 'jane' // No refetch
Expected behavior:
const userId = ref('user123')
const searchQuery = ref('john')
const { data } = useQuery({
...getUsersOptions({
path: { id: userId }, // β
Pass ref directly
query: { search: searchQuery }, // β
Pass ref directly
}),
})
// These should trigger automatic refetch:
userId.value = 'user456' // β
Refetch
searchQuery.value = 'jane' // β
Refetch
Root cause:
The plugin currently generates:
export function getUsersOptions(options: Options<GetUsersData>) {
return queryOptions({
queryFn: async ({ queryKey, signal }) => { /* ... */ },
queryKey: getUsersQueryKey(options), // Static queryKey!
})
}
It should generate:
export function getUsersOptions(options: MaybeRefOrGetter<Options<GetUsersData>>) {
return queryOptions({
queryFn: async ({ queryKey, signal }) => {
const resolvedOptions = toValue(options) // Unwrap reactive values
// ...
},
queryKey: computed(() => getUsersQueryKey(options)), // Reactive queryKey!
})
}
Proposed solution:
Create Vue-specific implementations in @tanstack/vue-query
plugin:
- Import Vue utilities:
MaybeRefOrGetter
,toValue
,computed from 'vue'
- Wrap function parameters with
MaybeRefOrGetter<Options<T>>
- Use
computed(() => queryKey(...))
for reactive query keys - Use
toValue(options)
insidequeryFn
to resolve reactive values
This approach aligns with TanStack Vue Query's design principles and is similar to how @pinia/colada
handles reactive parameters.
Reproducible example or configuration
https://stackblitz.com/edit/nuxt-starter-ctyy1wrx?file=app%2Fpages%2Findex.vue
OpenAPI specification (optional)
No response
System information (optional)
No response
Metadata
Metadata
Assignees
Labels
bug π₯Something isn't workingSomething isn't workingfeature πNew feature or requestNew feature or request