-
-
Notifications
You must be signed in to change notification settings - Fork 3.8k
placeholderData with keepPreviousData doesn't work #6754
Copy link
Copy link
Closed as not planned
Labels
Description
Describe the bug
Reading the docs you mention that setting placeholderData with keepPreviousData will be return the data with the previous query data but testing it doesn't happen
I am testing the pagination feature with the example from the web site:
import React from 'react'
import axios from 'axios'
import {
useQuery,
useQueryClient,
QueryClient,
QueryClientProvider,
keepPreviousData,
} from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
const queryClient = new QueryClient()
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<Example />
</QueryClientProvider>
)
}
async function fetchProjects(page = 0) {
const { data } = await axios.get('/api/projects?page=' + page)
return data
}
function Example() {
const queryClient = useQueryClient()
const [page, setPage] = React.useState(0)
const { status, data, error, isFetching, isPlaceholderData } = useQuery({
queryKey: ['projects', page],
queryFn: () => fetchProjects(page),
placeholderData: keepPreviousData,
staleTime: 5000,
})
// Prefetch the next page!
React.useEffect(() => {
if (!isPlaceholderData && data?.hasMore) {
queryClient.prefetchQuery({
queryKey: ['projects', page + 1],
queryFn: () => fetchProjects(page + 1),
})
}
}, [data, isPlaceholderData, page, queryClient])
return (
<div>
<p>
In this example, each page of data remains visible as the next page is
fetched. The buttons and capability to proceed to the next page are also
supressed until the next page cursor is known. Each page is cached as a
normal query too, so when going to previous pages, you'll see them
instantaneously while they are also refetched invisibly in the
background.
</p>
{status === 'pending' ? (
<div>Loading...</div>
) : status === 'error' ? (
<div>Error: {error.message}</div>
) : (
// `data` will either resolve to the latest page's data
// or if fetching a new page, the last successful page's data
<div>
{data.projects.map((project) => (
<p key={project.id}>{project.name}</p>
))}
</div>
)}
<div>Current Page: {page + 1}</div>
<button
onClick={() => setPage((old) => Math.max(old - 1, 0))}
disabled={page === 0}
>
Previous Page
</button>{' '}
<button
onClick={() => {
setPage((old) => (data?.hasMore ? old + 1 : old))
}}
disabled={isPlaceholderData || !data?.hasMore}
>
Next Page
</button>
{
// Since the last page's data potentially sticks around between page requests,
// we can use `isFetching` to show a background loading
// indicator since our `status === 'pending'` state won't be triggered
isFetching ? <span> Loading...</span> : null
}{' '}
<ReactQueryDevtools initialIsOpen />
</div>
)
}
here I should see previous projects(1, 2, 3, 4 ...), let me know if I am wrong:
Your minimal, reproducible example
https://codesandbox.io/p/devbox/github/tanstack/query/tree/main/examples/react/pagination
Steps to reproduce
- create a useQuery
- add the option placeholderData with keepPreviousData
- increase the pagination
Expected behavior
Expected behavior: In the data of Query I should see the previous data
How often does this bug happen?
Every time
Screenshots or Videos
No response
Platform
IOS and Web
Tanstack Query adapter
None
TanStack Query version
5.17.19
TypeScript version
No response
Additional context
No response
Reactions are currently unavailable
