Url-based (client-side) pagination with Gatsby
I like to be able to refresh my browser, use the back button or bookmark a page without losing context. So for Prune your follows, we already had an URL structure for filters like this:
Keeping the selected filter in the URL makes all the use cases mentioned above possible.
The Gatsby File System Route API does the heavy lifting for us, automagically surfacing the selected filter as a page prop:
// File: ./src/pages/app/filter/[...filter].js πππ
import React from "react";
export default function FilterPage(props) {
return (
<main>
<p>Your selected filter is {props.params.filter}</p>
{/* OR */}
<p>Your selected filter is {props.filter}</p>
</main>
);
}
The path /app/filter/unfollowed in the above example prints out βYour selected filter is unfollowedβ twice as I wanted to show that the selected filter is available both in props.filter and props.params.filter.
For pagination, we need to add another level in our file system:
// ./src/pages/app/filter/[filter]/[...page].js πππ
import React from "react";
export default function FilterPage(props) {
return (
<main>
<p>
Your selected filter is {props.filter}, <br />
and your selected page is {props.page}
</p>
</main>
);
}
/app/filter/unpopular=> βYour selected filter is unpopular, and your selected page isβ/app/filter/overactive/3=> βYour selected filter is overactive, and your selected page is 3β
BTW: These values are strings (or undefined), so it might be a good idea to convert the page into a pageIndex right away and add a sensible default:
// ./src/pages/app/filter/[filter]/[...page].js
import React from "react";
export default function FilterPage(props) {
const pageIndex = props.page ? parseInt(props.page) : 0; πππ
return (
<main>
<p>
Your selected filter is {props.filter} <br />
and your selected page is {pageIndex}
</p>
</main>
);
}
With the above changes:
/app/filter/unpopular=> βYour selected filter is unpopular, and your selected page is 0β
All the best,
Queen Raae
PS: There is a follow up showing pagination in tandem with React Query