48
loading...
This website collects cookies to deliver better user experience
import "../styles/globals.css";
import { ReactQueryDevtools } from "react-query/devtools";
import { Hydrate, QueryClient, QueryClientProvider } from "react-query";
import { useState } from "react";
function MyApp({ Component, pageProps }) {
const [queryClient] = useState(() => new QueryClient());
return (
<QueryClientProvider client={queryClient}>
<Hydrate state={pageProps.dehydratedState}>
<Component {...pageProps} />
<ReactQueryDevtools initialIsOpen={false}></ReactQueryDevtools>
</Hydrate>
</QueryClientProvider>
);
}
export default MyApp;
export async function getServerSideProps(context) {
let page = 1;
if (context.query.page) {
page = parseInt(context.query.page);
}
const queryClient = new QueryClient();
await queryClient.prefetchQuery(
["characters", page],
async () =>
await fetch(
`https://rickandmortyapi.com/api/character/?page=${page}`
).then((result) => result.json()),
);
return { props: { dehydratedState: dehydrate(queryClient) } };
}
localhost:3001/paginationSSR?page=14
to go directly to page 14 for example, will also fetch the data for page 1. This happens because our default value for page is set to 1, so it fetches the data for page 1 immediately after rendering. We will fix it like so:
const [page, setPage] = useState(parseInt(router.query.page) || 1);
function handlePaginationChange(e, value) {
setPage(value);
router.push(`paginationSSR/?page=${value}`, undefined, { shallow: true });
}
refetchonMount
and refetchOnWindowFocus
to false. You will have to evaluate your use case to see whether it's best to leave them activated.
const { data } = useQuery(
["characters", page],
async () =>
await fetch(
`https://rickandmortyapi.com/api/character/?page=${page}`
).then((result) => result.json()),
{
keepPreviousData: true,
refetchOnMount: false,
refetchOnWindowFocus: false,
}
);