diff --git a/packages/vue-query/src/useBaseQuery.ts b/packages/vue-query/src/useBaseQuery.ts index a50fad15aa..245a073e8b 100644 --- a/packages/vue-query/src/useBaseQuery.ts +++ b/packages/vue-query/src/useBaseQuery.ts @@ -2,8 +2,9 @@ import { computed, getCurrentScope, onScopeDispose, - reactive, readonly, + shallowReactive, + shallowReadonly, toRefs, watch, } from 'vue-demi' @@ -105,7 +106,7 @@ export function useBaseQuery< }) const observer = new Observer(client, defaultedOptions.value) - const state = reactive(observer.getCurrentResult()) + const state = shallowReactive(observer.getCurrentResult()) let unsubscribe = () => { // noop @@ -145,7 +146,7 @@ export function useBaseQuery< return new Promise>( (resolve, reject) => { let stopWatch = () => { - //noop + // noop } const run = () => { if (defaultedOptions.value.enabled !== false) { @@ -201,7 +202,15 @@ export function useBaseQuery< }, ) - const object: any = toRefs(readonly(state)) + const readonlyState = + process.env.NODE_ENV === 'production' + ? state + : // @ts-expect-error + defaultedOptions.value.shallow + ? shallowReadonly(state) + : readonly(state) + + const object: any = toRefs(readonlyState) for (const key in state) { if (typeof state[key as keyof typeof state] === 'function') { object[key] = state[key as keyof typeof state] diff --git a/packages/vue-query/src/useInfiniteQuery.ts b/packages/vue-query/src/useInfiniteQuery.ts index f0e4c3134e..c4a9bcb681 100644 --- a/packages/vue-query/src/useInfiniteQuery.ts +++ b/packages/vue-query/src/useInfiniteQuery.ts @@ -49,6 +49,8 @@ export type UseInfiniteQueryOptions< TPageParam >[Property] > +} & { + shallow?: boolean } export type UseInfiniteQueryReturnType = UseBaseQueryReturnType< diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 40c336bac5..91aff2655b 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -2,8 +2,9 @@ import { computed, getCurrentScope, onScopeDispose, - reactive, readonly, + shallowReactive, + shallowReadonly, toRefs, watch, } from 'vue-demi' @@ -26,12 +27,17 @@ type MutationResult = DistributiveOmit< 'mutate' | 'reset' > +type UseMutationOptionsBase = + MutationObserverOptions & { + shallow?: boolean + } + export type UseMutationOptions< TData = unknown, TError = DefaultError, TVariables = void, TContext = unknown, -> = MaybeRefDeep> +> = MaybeRefDeep> type MutateSyncFunction< TData = unknown, @@ -61,7 +67,7 @@ export function useMutation< TContext = unknown, >( mutationOptions: MaybeRefDeep< - MutationObserverOptions + UseMutationOptionsBase >, queryClient?: QueryClient, ): UseMutationReturnType { @@ -78,7 +84,7 @@ export function useMutation< return client.defaultMutationOptions(cloneDeepUnref(mutationOptions)) }) const observer = new MutationObserver(client, options.value) - const state = reactive(observer.getCurrentResult()) + const state = shallowReactive(observer.getCurrentResult()) const unsubscribe = observer.subscribe((result) => { updateState(state, result) @@ -101,7 +107,14 @@ export function useMutation< unsubscribe() }) - const resultRefs = toRefs(readonly(state)) as unknown as ToRefs< + const readonlyState = + process.env.NODE_ENV === 'production' + ? state + : options.value.shallow + ? shallowReadonly(state) + : readonly(state) + + const resultRefs = toRefs(readonlyState) as ToRefs< Readonly> > diff --git a/packages/vue-query/src/useMutationState.ts b/packages/vue-query/src/useMutationState.ts index ae9ccd6476..465c123ca0 100644 --- a/packages/vue-query/src/useMutationState.ts +++ b/packages/vue-query/src/useMutationState.ts @@ -2,13 +2,13 @@ import { computed, getCurrentScope, onScopeDispose, - readonly, - ref, + shallowReadonly, + shallowRef, watch, } from 'vue-demi' import { useQueryClient } from './useQueryClient' import { cloneDeepUnref } from './utils' -import type { DeepReadonly, Ref } from 'vue-demi' +import type { Ref } from 'vue-demi' import type { MutationFilters as MF, Mutation, @@ -68,10 +68,12 @@ function getResult( export function useMutationState( options: MutationStateOptions = {}, queryClient?: QueryClient, -): DeepReadonly>> { +): Readonly>> { const filters = computed(() => cloneDeepUnref(options.filters)) const mutationCache = (queryClient || useQueryClient()).getMutationCache() - const state = ref(getResult(mutationCache, options)) as Ref> + const state = shallowRef(getResult(mutationCache, options)) as Ref< + Array + > const unsubscribe = mutationCache.subscribe(() => { const result = getResult(mutationCache, options) state.value = result @@ -85,5 +87,5 @@ export function useMutationState( unsubscribe() }) - return readonly(state) + return shallowReadonly(state) } diff --git a/packages/vue-query/src/useQueries.ts b/packages/vue-query/src/useQueries.ts index 9300bb0ad7..371fdcc4db 100644 --- a/packages/vue-query/src/useQueries.ts +++ b/packages/vue-query/src/useQueries.ts @@ -4,6 +4,7 @@ import { getCurrentScope, onScopeDispose, readonly, + shallowReadonly, shallowRef, unref, watch, @@ -256,6 +257,7 @@ export function useQueries< }: { queries: MaybeRefDeep> combine?: (result: UseQueriesResults) => TCombinedResult + shallow?: boolean }, queryClient?: QueryClient, ): Readonly> { @@ -348,5 +350,9 @@ export function useQueries< unsubscribe() }) - return readonly(state) as Readonly> + return process.env.NODE_ENV === 'production' + ? state + : options.shallow + ? shallowReadonly(state) + : (readonly(state) as Readonly>) } diff --git a/packages/vue-query/src/useQuery.ts b/packages/vue-query/src/useQuery.ts index ad91144139..af3f1ea31d 100644 --- a/packages/vue-query/src/useQuery.ts +++ b/packages/vue-query/src/useQuery.ts @@ -23,33 +23,37 @@ export type UseQueryOptions< TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, -> = MaybeRef<{ - [Property in keyof QueryObserverOptions< - TQueryFnData, - TError, - TData, - TQueryData, - TQueryKey - >]: Property extends 'enabled' - ? MaybeRefOrGetter< - QueryObserverOptions< - TQueryFnData, - TError, - TData, - TQueryData, - DeepUnwrapRef - >[Property] - > - : MaybeRefDeep< - QueryObserverOptions< - TQueryFnData, - TError, - TData, - TQueryData, - DeepUnwrapRef - >[Property] - > -}> +> = MaybeRef< + { + [Property in keyof QueryObserverOptions< + TQueryFnData, + TError, + TData, + TQueryData, + TQueryKey + >]: Property extends 'enabled' + ? MaybeRefOrGetter< + QueryObserverOptions< + TQueryFnData, + TError, + TData, + TQueryData, + DeepUnwrapRef + >[Property] + > + : MaybeRefDeep< + QueryObserverOptions< + TQueryFnData, + TError, + TData, + TQueryData, + DeepUnwrapRef + >[Property] + > + } & { + shallow?: boolean + } +> export type UndefinedInitialQueryOptions< TQueryFnData = unknown, diff --git a/packages/vue-query/src/utils.ts b/packages/vue-query/src/utils.ts index df68e966cd..8c73f20947 100644 --- a/packages/vue-query/src/utils.ts +++ b/packages/vue-query/src/utils.ts @@ -9,7 +9,7 @@ export function getClientKey(key?: string) { } export function updateState( - state: Record, + state: Record, update: Record, ): void { Object.keys(state).forEach((key) => {