Skip to content

Commit 418c48f

Browse files
authored
fix(useQuery): apply placeholderData also to disabled queries (TanStack#2541)
1 parent b5c15c9 commit 418c48f

File tree

3 files changed

+61
-3
lines changed

3 files changed

+61
-3
lines changed

src/core/queryObserver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ export class QueryObserver<
495495
if (
496496
typeof options.placeholderData !== 'undefined' &&
497497
typeof data === 'undefined' &&
498-
status === 'loading'
498+
(status === 'loading' || status === 'idle')
499499
) {
500500
let placeholderData
501501

src/core/tests/queryObserver.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,8 +473,8 @@ describe('queryObserver', () => {
473473
})
474474

475475
expect(observer.getCurrentResult()).toMatchObject({
476-
status: 'idle',
477-
data: undefined,
476+
status: 'success',
477+
data: 'placeholder',
478478
})
479479

480480
const results: QueryObserverResult<unknown>[] = []

src/react/tests/useQuery.test.tsx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3489,6 +3489,64 @@ describe('useQuery', () => {
34893489
])
34903490
})
34913491

3492+
it('should use placeholder data even for disabled queries', async () => {
3493+
const key1 = queryKey()
3494+
3495+
const states: { state: UseQueryResult<string>; count: number }[] = []
3496+
3497+
function Page() {
3498+
const [count, setCount] = React.useState(0)
3499+
3500+
const state = useQuery(key1, () => 'data', {
3501+
placeholderData: 'placeholder',
3502+
enabled: count === 0,
3503+
})
3504+
3505+
states.push({ state, count })
3506+
3507+
React.useEffect(() => {
3508+
setCount(1)
3509+
}, [])
3510+
3511+
return (
3512+
<div>
3513+
<h2>Data: {state.data}</h2>
3514+
<div>Status: {state.status}</div>
3515+
</div>
3516+
)
3517+
}
3518+
3519+
const rendered = renderWithClient(queryClient, <Page />)
3520+
await waitFor(() => rendered.getByText('Data: data'))
3521+
3522+
expect(states).toMatchObject([
3523+
{
3524+
state: {
3525+
isSuccess: true,
3526+
isPlaceholderData: true,
3527+
data: 'placeholder',
3528+
},
3529+
count: 0,
3530+
},
3531+
{
3532+
state: {
3533+
isSuccess: true,
3534+
isPlaceholderData: true,
3535+
data: 'placeholder',
3536+
},
3537+
count: 1,
3538+
},
3539+
{
3540+
state: {
3541+
isSuccess: true,
3542+
isPlaceholderData: false,
3543+
data: 'data',
3544+
},
3545+
count: 1,
3546+
},
3547+
])
3548+
})
3549+
34923550
it('placeholder data should run through select', async () => {
34933551
const key1 = queryKey()
34943552

0 commit comments

Comments
 (0)