Skip to content

Commit b124ca8

Browse files
authored
fix: string and array query keys should be similar (TanStack#1799)
1 parent 7906ce7 commit b124ca8

File tree

5 files changed

+29
-17
lines changed

5 files changed

+29
-17
lines changed

src/core/queriesObserver.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { difference, getQueryKeyHashFn, replaceAt } from './utils'
1+
import { difference, replaceAt } from './utils'
22
import { notifyManager } from './notifyManager'
33
import type { QueryObserverOptions, QueryObserverResult } from './types'
44
import type { QueryClient } from './queryClient'
@@ -63,8 +63,6 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
6363
let observer: QueryObserver | undefined = this.observers[i]
6464

6565
const defaultedOptions = this.client.defaultQueryObserverOptions(options)
66-
const hashFn = getQueryKeyHashFn(defaultedOptions)
67-
defaultedOptions.queryHash = hashFn(defaultedOptions.queryKey!)
6866

6967
if (
7068
!observer ||
@@ -94,8 +92,6 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
9492
const defaultedOptions = this.client.defaultQueryObserverOptions(
9593
options
9694
)
97-
const hashFn = getQueryKeyHashFn(defaultedOptions)
98-
defaultedOptions.queryHash = hashFn(defaultedOptions.queryKey!)
9995

10096
if (
10197
!observer ||

src/core/queryCache.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
22
QueryFilters,
3-
getQueryKeyHashFn,
3+
hashQueryKeyByOptions,
44
matchQuery,
55
parseFilterArgs,
66
} from './utils'
@@ -43,7 +43,8 @@ export class QueryCache extends Subscribable<QueryCacheListener> {
4343
state?: QueryState<TData, TError>
4444
): Query<TQueryFnData, TError, TData> {
4545
const queryKey = options.queryKey!
46-
const queryHash = options.queryHash ?? getQueryKeyHashFn(options)(queryKey)
46+
const queryHash =
47+
options.queryHash ?? hashQueryKeyByOptions(queryKey, options)
4748
let query = this.get<TQueryFnData, TError, TData>(queryHash)
4849

4950
if (!query) {

src/core/queryClient.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
parseFilterArgs,
77
parseQueryArgs,
88
partialMatchKey,
9-
getQueryKeyHashFn,
9+
hashQueryKeyByOptions,
1010
} from './utils'
1111
import type {
1212
DefaultOptions,
@@ -456,8 +456,9 @@ export class QueryClient {
456456
} as T
457457

458458
if (!defaultedOptions.queryHash && defaultedOptions.queryKey) {
459-
defaultedOptions.queryHash = getQueryKeyHashFn(defaultedOptions)(
460-
defaultedOptions.queryKey
459+
defaultedOptions.queryHash = hashQueryKeyByOptions(
460+
defaultedOptions.queryKey,
461+
defaultedOptions
461462
)
462463
}
463464

src/core/tests/queryClient.test.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,19 @@ describe('queryClient', () => {
140140
expect(queryClient.getQueryData(key)).toBe('qux')
141141
})
142142

143+
test('should use the same query when using similar string or array query keys', () => {
144+
const key = queryKey()
145+
queryClient.setQueryData(key, '1')
146+
expect(queryClient.getQueryData(key)).toBe('1')
147+
expect(queryClient.getQueryData([key])).toBe('1')
148+
queryClient.setQueryData([key], '2')
149+
expect(queryClient.getQueryData(key)).toBe('2')
150+
expect(queryClient.getQueryData([key])).toBe('2')
151+
queryClient.setQueryData(key, '1')
152+
expect(queryClient.getQueryData(key)).toBe('1')
153+
expect(queryClient.getQueryData([key])).toBe('1')
154+
})
155+
143156
test('should accept an update function', () => {
144157
const key = queryKey()
145158

src/core/utils.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import type {
55
MutationOptions,
66
QueryFunction,
77
QueryKey,
8-
QueryKeyHashFunction,
98
QueryOptions,
109
} from './types'
1110

@@ -153,8 +152,7 @@ export function matchQuery(
153152

154153
if (isQueryKey(queryKey)) {
155154
if (exact) {
156-
const hashFn = getQueryKeyHashFn(query.options)
157-
if (query.queryHash !== hashFn(queryKey)) {
155+
if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {
158156
return false
159157
}
160158
} else if (!partialMatchKey(query.queryKey, queryKey)) {
@@ -189,17 +187,20 @@ export function matchQuery(
189187
return true
190188
}
191189

192-
export function getQueryKeyHashFn(
190+
export function hashQueryKeyByOptions(
191+
queryKey: QueryKey,
193192
options?: QueryOptions<any, any>
194-
): QueryKeyHashFunction {
195-
return options?.queryKeyHashFn || hashQueryKey
193+
): string {
194+
const hashFn = options?.queryKeyHashFn || hashQueryKey
195+
return hashFn(queryKey)
196196
}
197197

198198
/**
199199
* Default query keys hash function.
200200
*/
201201
export function hashQueryKey(queryKey: QueryKey): string {
202-
return stableValueHash(queryKey)
202+
const asArray = Array.isArray(queryKey) ? queryKey : [queryKey]
203+
return stableValueHash(asArray)
203204
}
204205

205206
/**

0 commit comments

Comments
 (0)