diff --git a/packages/query-core/src/queryObserver.ts b/packages/query-core/src/queryObserver.ts index e85973a60d..e4095a13f5 100644 --- a/packages/query-core/src/queryObserver.ts +++ b/packages/query-core/src/queryObserver.ts @@ -834,7 +834,7 @@ function shouldAssignObserverCurrentProperties< // if the newly created result isn't what the observer is holding as current, // then we'll need to update the properties as well - if (observer.getCurrentResult() !== optimisticResult) { + if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) { return true } diff --git a/packages/react-query/src/__tests__/useQuery.test.tsx b/packages/react-query/src/__tests__/useQuery.test.tsx index efe33951ea..394233a5af 100644 --- a/packages/react-query/src/__tests__/useQuery.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.test.tsx @@ -6211,4 +6211,25 @@ describe('useQuery', () => { await waitFor(() => rendered.getByText('Rendered Id: 2')) expect(spy).toHaveBeenCalledTimes(1) }) + it('should not cause an infinite render loop when using unstable callback ref', async () => { + const key = queryKey() + + function Test() { + const [_, setRef] = React.useState() + + const { data } = useQuery({ + queryKey: [key], + queryFn: async () => { + await sleep(5) + return 'Works' + }, + }) + + return
setRef(value)}>{data}
+ } + + const rendered = renderWithClient(queryClient, ) + + await waitFor(() => rendered.getByText('Works')) + }) })