useMutationState does not update when filters change (react-query)
Maintainer antworten meist innerhalb von 1 Tag
@MahathirMohammadShuvo arbeitet bereits daran.
Seit 29.8.2026.
Bewertung
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Anfängerfreundlichkeit
- 78/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- react, typescript
Rechercherichtung
Beginne mit der Implementierung von useMutationState und deren getSnapshot- sowie mutationCache.subscribe-Logik und füge dann den Regressionsfall zu packages/react-query/src/tests/useMutationState.test.tsx hinzu. Führe pnpm nx run @tanstack/react-query:test:lib -- useMutationState aus. Fertig ist die Änderung, wenn das Ergebnis von variables: 1,2 zu variables: 1 aktualisiert wird, wenn sich die Filter ohne eine Cache-Aktualisierung ändern.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Describe the bug
useMutationState() ignores changes to filters. The result is only recomputed when the mutation cache notifies, so after a filter change the array keeps showing the old filters' results until something unrelated touches the cache. If nothing does, it stays wrong.
result.current is only written inside the mutationCache.subscribe() callback, and getSnapshot is () => result.current. So a render with new options recomputes nothing.
Same symptom as #11152 / #11153 in svelte-query, different cause.
Your minimal, reproducible example
N/A, reproduces in the package's own vitest suite.
Steps to reproduce
Add to packages/react-query/src/__tests__/useMutationState.test.tsx, run pnpm nx run @tanstack/react-query:test:lib -- useMutationState:
it('should update the result when mutation filters change without a cache update', async () => {
const queryClient = new QueryClient()
const key1 = queryKey()
const key2 = queryKey()
function Variables({ mutationKey }: { mutationKey?: Array<string> }) {
const variables = useMutationState({
filters: { mutationKey },
select: (mutation) => mutation.state.variables,
})
return <div>variables: {variables.join(',')}</div>
}
function Page({ mutationKey }: { mutationKey?: Array<string> }) {
const { mutate: mutate1 } = useMutation({
mutationKey: key1,
mutationFn: (input: number) => sleep(100).then(() => 'data' + input),
})
const { mutate: mutate2 } = useMutation({
mutationKey: key2,
mutationFn: (input: number) => sleep(100).then(() => 'data' + input),
})
React.useEffect(() => {
mutate1(1)
mutate2(2)
}, [mutate1, mutate2])
return <Variables mutationKey={mutationKey} />
}
const rendered = renderWithClient(queryClient, <Page mutationKey={undefined} />)
await vi.advanceTimersByTimeAsync(0)
expect(rendered.getByText('variables: 1,2')).toBeInTheDocument()
rendered.rerender(<Page mutationKey={key1} />)
expect(rendered.getByText('variables: 1')).toBeInTheDocument()
})
Both mutations stay pending, so the cache never notifies. Output stays variables: 1,2 instead of variables: 1.
Expected behavior
The array should always reflect whatever filters currently select, as it does in vue-query, angular and lit.
How often does this bug happen?
Every time
Platform
N/A, jsdom.
Tanstack Query adapter
react-query
TanStack Query version
v5.102.2
TypeScript version
v6.0.3
- Vorherrschende Sprache
- TypeScript
- Sterne
- 50.4k
- Forks
- 4.2k
- Ø Merge
- 11 Std. 33 Min.
- Gemergte PRs (30 T.)
- 421
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus TanStack/query
-
solid-query: STRICT_READ_UNTRACKED on Solid 2 — client()/options() read in component body (useMutation, useBaseQuery)Evtl. wieder frei Ein Pull Request dazu wurde ohne Merge geschlossen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
TanStack/query#11358 · 2 Kommentare · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
-
solid-query: switching the queryClient accessor strands the new client's cache (subscription stays on the old observer)Evtl. vergeben @MaNaN1803 hat das vor 75 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
TanStack/query#11106 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 45/100
Maintainer antworten meist innerhalb von 1 Tag
-
setQueryData: NoInfer loses discriminated-union members when spreading a narrowed updater valueEvtl. vergeben @iosayin hat das vor 1 Tag übernommen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 55/100
Maintainer antworten meist innerhalb von 1 Tag
-
setQueryData updater loses discriminated-union fields when spreading inferred NoInfer dataEvtl. vergeben @boriskozak hat das vor 1 Tag übernommen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 68/100
TanStack/query#11794 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
Ähnliche Issues
-
Schwierigkeit 2/5 Unter einer Stunde Anfängerfreundlichkeit 85/100
capricorn86/happy-dom#2474 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
JSerwatka/letterboxd-tweaks#81 · 1 Kommentar ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
siyuan-note/siyuan#20165 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
polkadot-js/phishing#5716 ·
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 90/100
juice-shop/juice-shop#3662 ·
Maintainer antworten meist innerhalb von 1 Tag