Despite Gatsby’s amazing performance, it would be best not to force the user to load every single post onto the same page. Instead, we’ll explore the gatsby-awesome-pagination plugin to segment our post archive into more manageable sections.
We’ll start with the gatsby-starter-blog starter since it comes with markdown support.
In our gatsby-node.js
file, Let’s import the paginate
method and pass it an object below the query for our posts. It only needs a few things, namely the createPage
action, an array of our posts, the item limit per page, the slug for our new archive page, and its template. Now when we make this query we’ll get get a bunch of extra stuff in the pageContext
prop we’ll use to manage which page is rendered.
The gatsby-awesome-pagination
plugin is, as far as I know, just for paginating separate ‘archive’ pages. So instead of adding pagination to the starter’s home page we’ll link to a separate posts page with everything. Groups of posts on normal pages would probably be best with just a static query and something like a carousel to manage what’s shown.
Our archive template already has access to our query’s pageContext
in its props, which we’ll pass to a separate Pager
component. Note that we need to use a normal query instead of a static query since our pageContext
will be passing values into the skip
and limit
arguments, which we’ll also need to set.
The final step is really as simple as getting the page paths from the pageContext
. If you log the pageContext
you can see the skip
and limit
properties that are being passed to the query, along with pageNumber
and numberOfPages
which you could use to generate a number and link for each page.
Adding navigation between each post is just as simple and doesn’t even need a plugin. This particular starter actually already supports this, but let’s pretend it doesn’t for now.
Where we create our pages from our query, we just need to add two fields that will then have access to in the pageContext
. If it’s the first post then prev
shouldn’t exist, else we’ll return the last post. Same with next
, only return the next post if one exists.
It’s the same execution as with our Pager
, check if prev/next exist, throw them in a Link
, and you’re done.
This plugin is still being ironed out, but I’m excited to see how they’ll improve this already incredibly simple design.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
I am getting a “TypeError: data is undefined” from the blog-archive.js file:
const posts = data.allMarkdownRemark.edges;
Any idea what might be causing this?