⚠️ This lesson is retired and might contain outdated information.

Add a List of Posts to a Gatsby Blog with a GraphQL Page Query

Taylor Bell
InstructorTaylor Bell
Share this video with your friends

Social Share Links

Send Tweet
Published 6 years ago
Updated 2 years ago

In this lesson, you’ll use GraphQL to query for transformed Markdown blog posts and display links to each of them on the blog’s homepage.

Instructor: [00:00] Let's add a list of all of our posts. Since we're going to be writing a page-level query, we can start by removing the static query import. We'll write our query at the bottom of the file, above our export.

[00:10] We'll write "export const query" and then "graphql" with two backticks for our tag template. We'll use the query keyword because that's what we're going to get from GraphQL .

[00:19] Let's call our query home pageQuery. Now we can use the GraphQL browser in order to help us write our query. We can browse through the root query type. We're going to be doing posts. We want allMarkdownRemark.

[00:30] Remember that this is a remark connection. We click that. Then we have edges, which is the paths in the file system. A node is going to be each file. We go through. We have the frontmatter. These are all of our frontmatter options.

[00:45] To close this out, we'll move this over to have a little room. You can see that I've written the query here. If I click run, this is all the information that we have, which is what we would expect.

[00:55] Let's go ahead and add it to our file. Now that we've written our query, we need to bring it into our layout component. Let's take a look at the props that get passed into our layout.

[01:04] Inside the console of our localhost 8000, we can see that our query is showing up under the data key. This means that we can ahead and destructure data from props inside of our layout component.

[01:15] We can get to our edges from data.allMarkdownRemark. Now let's try just console.logging edges. These have our nodes like we'd expect. Now let's map over our edges in order to display our post titles.

[01:27] Between a couple braces, we'll do edges.map. We'll pass each edge in. From each edge, we want to get to the frontmatter. We'll destructure it. Then we'll return a div with the frontmatter's title.

[01:42] The first thing I notice is that I should add a key. Now we have a list of our posts, but you'll notice that they're not in order. Let's fix it.

[01:50] Going back to the GraphQL browser, we can scroll back through to allMarkdownRemark. We can see that it will take some arguments, one of them being sort. We can sort on fields. We can provide an order.

[02:02] The fields include a frontmatter date, which is a pretty solid choice, and an order. Makes sense that it would be ascending or descending.

[02:10] What we can do here is in our query, next to allMarkdownRemark, add a couple parens. We are going to sort and provide options here. Let's do order descending. For fields, we'll provide it with frontmatter___date.

[02:28] Save it. Check it out. There they are, newest to oldest. Now, through the magic of editing, I've added some styling.

Peter
Peter
~ 6 years ago

Is anybody else getting a strange error from GrahpQl?

  Invariant Violation: GraphQLCompilerContext: Duplicate document named `HomepageQuery`. GraphQL fragments and roots must have unique names.
    t: Duplicate document named `HomepageQuery`. GraphQL fragments and roots must have unique names.```
James Maclean
James Maclean
~ 5 years ago
  1. Why use a 'Page query' instead of a 'Static' one?
  2. It looks like a query exported in my index.js is available on other pages. Why does this happen?
Lauro Silva
Lauro Silva
~ 4 years ago

Hey James, good question. It seems that StaticQuery can do most of the things that page query can, including fragments. The main differences are:

  • page queries can accept variables (via pageContext) but can only be added to page components.
  • StaticQuery does not accept variables (hence the name “static”), but can be used in any component, including pages.

As of Gatsby v2, StaticQuery seems to be the default choice. So I would suggest just using StaticQuery. Link to the documentation.

Markdown supported.
Become a member to join the discussionEnroll Today