diff --git a/.changeset/fuzzy-taxis-track.md b/.changeset/fuzzy-taxis-track.md new file mode 100644 index 0000000000..46b71afbd6 --- /dev/null +++ b/.changeset/fuzzy-taxis-track.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-core': patch +--- + +Avoid repeatedly synchronizing the same tracked property across all observers in `useQueries`. diff --git a/packages/query-core/src/__tests__/queriesObserver.test.tsx b/packages/query-core/src/__tests__/queriesObserver.test.tsx index 4e940fca40..bb7a64c03c 100644 --- a/packages/query-core/src/__tests__/queriesObserver.test.tsx +++ b/packages/query-core/src/__tests__/queriesObserver.test.tsx @@ -770,6 +770,10 @@ describe('queriesObserver', () => { expect(trackPropSpy).toHaveBeenCalledWith('status') expect(trackPropSpy).toHaveBeenCalledTimes(3) + void trackedResults[1]!.status + + expect(trackPropSpy).toHaveBeenCalledTimes(4) + trackPropSpy.mockRestore() }) diff --git a/packages/query-core/src/queriesObserver.ts b/packages/query-core/src/queriesObserver.ts index 4fcf8e5d41..c537b557ca 100644 --- a/packages/query-core/src/queriesObserver.ts +++ b/packages/query-core/src/queriesObserver.ts @@ -200,14 +200,19 @@ export class QueriesObserver< result: Array, matches: Array, ) { + const trackedProps = new Set() + return matches.map((match, index) => { const observerResult = result[index]! return !match.defaultedQueryOptions.notifyOnChangeProps ? match.observer.trackResult(observerResult, (accessedProp) => { // track property on all observers to ensure proper (synchronized) tracking (#7000) - matches.forEach((m) => { - m.observer.trackProp(accessedProp) - }) + if (!trackedProps.has(accessedProp)) { + trackedProps.add(accessedProp) + matches.forEach((m) => { + m.observer.trackProp(accessedProp) + }) + } }) : observerResult })