问题
I have 16 images that I want to render out onto a website in a grid format.
I'm using the following plugins for this:
gatsby-image
gatsby-source-filesystem
gatsby-plugin-sharp
gatsby-transformer-sharp
I read the documentation and as for as I know, it only demonstrated how to query for one single image.
e.g.
import React from "react"
import { graphql } from "gatsby"
import Img from "gatsby-image"
export default ({ data }) => (
<div>
<h1>Hello gatsby-image</h1>
<Img fixed={data.file.childImageSharp.fixed} />
</div>
)
export const query = graphql`
query {
file(relativePath: { eq: "blog/avatars/kyle-mathews.jpeg" }) {
childImageSharp {
# Specify the image processing specifications right in the query.
# Makes it trivial to update as your page's design changes.
fixed(width: 125, height: 125) {
...GatsbyImageSharpFixed
}
}
}
}
`
But how would I go about this if I had 16 images? Writing 16 separate queries seem rather cumbersome and would be difficult to read in the future.
I saw this code in the docs referencing multiple images, but I have trouble trying to access the images themselves.
e.g.
export const squareImage = graphql`
fragment squareImage on File {
childImageSharp {
fluid(maxWidth: 200, maxHeight: 200) {
...GatsbyImageSharpFluid
}
}
}
`
export const query = graphql`
query {
image1: file(relativePath: { eq: "images/image1.jpg" }) {
...squareImage
}
image2: file(relativePath: { eq: "images/image2.jpg" }) {
...squareImage
}
image3: file(relativePath: { eq: "images/image3.jpg" }) {
...squareImage
}
}
`
My folder structure is as follows:
---package.json
---src
------images
---------the 16 images
------pages
---------the page where I want to render the 16 images in
etc.
Thank you.
回答1:
Having a poke around in GraphiQL should help you, especially the Explorer. Although remember that Gatsby fragments won't work in GraphiQL.
{
allImageSharp {
edges {
node {
id
fluid(maxWidth: 200, maxHeight: 200) {
...GatsbyImageSharpFluid
}
}
}
}
}
So the above should be equal to something like the following query which will work in GraphiQL
{
allImageSharp {
edges {
node {
id
fluid(maxHeight: 200, maxWidth: 200) {
src
srcSet
base64
aspectRatio
originalImg
sizes
}
}
}
}
}
Then your component can use this same query and render the results like this:
import React from "react"
import { graphql } from "gatsby"
import Img from "gatsby-image"
const imgGridStyle = {
display: 'grid',
gridTemplateColumns: `repeat(auto-fill, 200px)`
};
export default ({ data }) => (
<div>
<h1>Hello gatsby-image</h1>
<div style={imgGridStyle}>
{data.allImageSharp.edges.map(edge =>
<Img fluid={edge.node.fluid} />
)}
</div>
</div>
)
export const query = graphql`
query {
allImageSharp {
edges {
node {
id
fluid(maxWidth: 200, maxHeight: 200) {
...GatsbyImageSharpFluid
}
}
}
}
}
`
You can easily loop over the resulting array of imageSharp nodes returned from the query in data.allImageSharp.edges.map
. Then pass each node's fluid
property, as the fluid
prop to gatsby-image
.
Note: This renders every imageSharp node in your project, which may or may not be what you want to achieve.
来源:https://stackoverflow.com/questions/56437205/how-do-i-query-multiple-images-with-gatsby-image