Using fragments
Fragments allow you to reuse parts of GraphQL queries. It also allows you to split up complex queries into smaller, easier to understand components.
The building blocks of a fragment
Here is an example fragment:
fragment FragmentName on TypeName {
field1
field2
}
A fragment consists of three components:
FragmentName
: the name of the fragment that will be referenced later.TypeName
: the GraphQL type of the object the fragment will be used on. This is important because you can only query for fields that actually exist on a given object.- The body of the query. You can define any fields with any level of nesting in here, the same that you would elsewhere in a GraphQL query
Creating and using a fragment
A fragment can be created inside any GraphQL query, but it’s good practice to create the query separately. More organization advice in the Conceptual Guide.
import React from "react"
import { graphql } from "gatsby"
export default ( props ) => {
return (...)
}
export const query = graphql`
fragment SiteInformation on Site {
siteMetadata {
title
siteDescription
}
}
`
This defines a fragment named SiteInformation
. Now it can be used from within the page’s GraphQL query:
import React from "react"
import { graphql } from "gatsby"
import IndexPost from "../components/IndexPost"
export default ({ data }) => {
return (
<div>
<h1>{data.site.siteMetadata.title}</h1>
<p>{data.site.siteMetadata.siteDescription}</p>
{/*
Or you can pass all the data from the fragment
back to the component that defined it
*/}
<IndexPost siteInformation={data.site.siteMetadata} />
</div>
)
}
export const query = graphql`
site {
...SiteInformation
}
`
When compiling your site, Gatsby preprocesses all GraphQL queries it finds. Therefore, any file that gets included in your project can define a snippet. However, only Pages can define GraphQL queries that actually return data. This is why we can define the fragment in the component file - it doesn’t actually return any data directly.
Further reading
Edit this page on GitHub