Skip to content

Commit da79651

Browse files
fix(vue-query): avoid use sync watchers that cause frequent requests (#6043)
* fix(vue-query): avoid use sync watchers that cause frequent requests * fix: remove unnecessary import --------- Co-authored-by: Damian Osipiuk <[email protected]>
1 parent 22b2860 commit da79651

File tree

7 files changed

+43
-36
lines changed

7 files changed

+43
-36
lines changed

packages/vue-query/src/__tests__/useQuery.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ describe('useQuery', () => {
146146
})
147147

148148
secondKeyRef.value = 'key8'
149+
await flushPromises()
150+
149151
expect(query).toMatchObject({
150152
status: { value: 'loading' },
151153
data: { value: undefined },
@@ -170,6 +172,9 @@ describe('useQuery', () => {
170172
})
171173

172174
enabled.value = true
175+
176+
await flushPromises()
177+
173178
expect(query).toMatchObject({
174179
fetchStatus: { value: 'fetching' },
175180
data: { value: undefined },

packages/vue-query/src/useBaseQuery.ts

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
shouldThrowError,
1616
updateState,
1717
} from './utils'
18-
import type { ToRefs } from 'vue-demi'
18+
import type { ToRef } from 'vue-demi'
1919
import type {
2020
QueryFunction,
2121
QueryKey,
@@ -31,7 +31,11 @@ export type UseQueryReturnType<
3131
TData,
3232
TError,
3333
Result = QueryObserverResult<TData, TError>,
34-
> = ToRefs<Readonly<Result>> & {
34+
> = {
35+
[K in keyof Result]: Result[K] extends (...args: any[]) => any
36+
? Result[K]
37+
: ToRef<Result[K]>
38+
} & {
3539
suspense: () => Promise<Result>
3640
}
3741

@@ -106,19 +110,23 @@ export function useBaseQuery<
106110
{ immediate: true },
107111
)
108112

109-
watch(
110-
defaultedOptions,
111-
() => {
112-
observer.setOptions(defaultedOptions.value)
113-
updateState(state, observer.getCurrentResult())
114-
},
115-
{ flush: 'sync' },
116-
)
113+
const updater = () => {
114+
observer.setOptions(defaultedOptions.value)
115+
updateState(state, observer.getCurrentResult())
116+
}
117+
118+
watch(defaultedOptions, updater)
117119

118120
onScopeDispose(() => {
119121
unsubscribe()
120122
})
121123

124+
// fix #5910
125+
const refetch = (...args: Parameters<typeof state['refetch']>) => {
126+
updater()
127+
return state.refetch(...args)
128+
}
129+
122130
const suspense = () => {
123131
return new Promise<QueryObserverResult<TData, TError>>(
124132
(resolve, reject) => {
@@ -166,10 +174,17 @@ export function useBaseQuery<
166174
},
167175
)
168176

169-
return {
170-
...(toRefs(readonly(state)) as UseQueryReturnType<TData, TError>),
171-
suspense,
177+
const object: any = toRefs(readonly(state))
178+
for (const key in state) {
179+
if (typeof state[key as keyof typeof state] === 'function') {
180+
object[key] = state[key as keyof typeof state]
181+
}
172182
}
183+
184+
object.suspense = suspense
185+
object.refetch = refetch
186+
187+
return object as UseQueryReturnType<TData, TError>
173188
}
174189

175190
export function parseQueryArgs<

packages/vue-query/src/useInfiniteQuery.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,6 @@ export function useInfiniteQuery<
105105
arg2,
106106
arg3,
107107
) as InfiniteQueryReturnType<TData, TError>
108-
return {
109-
...result,
110-
fetchNextPage: result.fetchNextPage.value,
111-
fetchPreviousPage: result.fetchPreviousPage.value,
112-
refetch: result.refetch.value,
113-
remove: result.remove.value,
114-
}
108+
109+
return result
115110
}

packages/vue-query/src/useIsFetching.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
onScopeDispose,
55
ref,
66
unref,
7-
watchSyncEffect,
7+
watchEffect,
88
} from 'vue-demi'
99
import { useQueryClient } from './useQueryClient'
1010
import { cloneDeepUnref, isQueryKey } from './utils'
@@ -44,7 +44,7 @@ export function useIsFetching(
4444

4545
const unsubscribe = queryClient.getQueryCache().subscribe(listener)
4646

47-
watchSyncEffect(listener)
47+
watchEffect(listener)
4848

4949
onScopeDispose(() => {
5050
unsubscribe()

packages/vue-query/src/useIsMutating.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
onScopeDispose,
55
ref,
66
unref,
7-
watchSyncEffect,
7+
watchEffect,
88
} from 'vue-demi'
99
import { useQueryClient } from './useQueryClient'
1010
import { cloneDeepUnref, isQueryKey } from './utils'
@@ -44,7 +44,7 @@ export function useIsMutating(
4444

4545
const unsubscribe = queryClient.getMutationCache().subscribe(listener)
4646

47-
watchSyncEffect(listener)
47+
watchEffect(listener)
4848

4949
onScopeDispose(() => {
5050
unsubscribe()

packages/vue-query/src/useMutation.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,9 @@ export function useMutation<
181181
})
182182
}
183183

184-
watch(
185-
options,
186-
() => {
187-
observer.setOptions(queryClient.defaultMutationOptions(options.value))
188-
},
189-
{ flush: 'sync' },
190-
)
184+
watch(options, () => {
185+
observer.setOptions(queryClient.defaultMutationOptions(options.value))
186+
})
191187

192188
onScopeDispose(() => {
193189
unsubscribe()

packages/vue-query/src/useQuery.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,5 @@ export function useQuery<
187187
| UseQueryDefinedReturnType<TData, TError> {
188188
const result = useBaseQuery(QueryObserver, arg1, arg2, arg3)
189189

190-
return {
191-
...result,
192-
refetch: result.refetch.value,
193-
remove: result.remove.value,
194-
}
190+
return result
195191
}

0 commit comments

Comments
 (0)