keepPreviousData (v4) đổi thành placeholderData: (prev) => prev ở v5: khi queryKey đổi (trang 1 → trang 2), React Query giữ data trang cũ trên màn hình thay vì xoá đi và hiện loading.
Cờ isPlaceholderData cho biết đang hiển thị data cũ.
ts
const { data, isPlaceholderData } = useQuery({
queryKey: ['todos', page],
queryFn: () => fetchTodos(page),
placeholderData: keepPreviousData, // hoặc: (prev) => prev
})
useEffect(() => {
if (!isPlaceholderData && hasNextPage) {
queryClient.prefetchQuery({
queryKey: ['todos', page + 1],
queryFn: () => fetchTodos(page + 1),
})
}
}, [data, page, isPlaceholderData, queryClient])- Phân trang: user vẫn thấy trang hiện tại (có thể làm mờ để báo đang tải), trang mới xong thì thay — không có flash trắng.
- Lọc/tìm kiếm: giữ kết quả cũ trong lúc chạy truy vấn mới, tránh nháy rỗng giữa hai lần gõ.
Lưu ý: nếu query có select transform thì previousData cũng đã đi qua select, nên type vẫn khớp.