I am new to Gatsby and its graphQL query system to retrieve assets. I have a working component Image
that fetches an image and displays it. I want to have the name of the image customizable but I can't figure out how to dit.
Here is the working component:
const Image = () => (
<StaticQuery
query={graphql`
query {
// fetching the image gatsby-astronaut.png
placeholderImage: file(relativePath: { eq: "gatsby-astronaut.png" }) {
childImageSharp {
fluid(maxWidth: 300) {
...GatsbyImageSharpFluid
}
}
}
}
`}
render={data => <Img fluid={data.placeholderImage.childImageSharp.fluid} />}
/>
);
And here is what I tried to have a customizable image:
const Image = ({ imgName }: { imgName: string }) => (
<StaticQuery
query={graphql`
query {
// fetching the image imgName
placeholderImage: file(relativePath: { eq: "${imgName}.png" }) {
childImageSharp {
fluid(maxWidth: 300) {
...GatsbyImageSharpFluid
}
}
}
}
`}
render={data => <Img fluid={data.placeholderImage.childImageSharp.fluid} />}
/>
);
But it raises the following error for the query:
Expected 1 arguments, but got 2.ts(2554)
How can I have a customizable image name?
The __typename field returns the object type's name as a String (e.g., Book or Author ). GraphQL clients use an object's __typename for many purposes, such as to determine which type was returned by a field that can return multiple types (i.e., a union or interface).
String interpolation is common in many programming languages which make heavy use of string representations of data, such as Apache Groovy, Julia, Kotlin, Perl, PHP, Python, Ruby, Scala, Swift, Tcl and most Unix shells.
In a GraphQL API, queries are used to fetch data from a server, while mutations are used to modify or write server-side data. Therefore, it is essential to understand its structure when defining a mutation, including the type definition, the mutation name, and variable definitions.
Here is the easy way I ran into:
const Image = props => {
const data = useStaticQuery(graphql`
query {
firstImg: file(relativePath: { eq: "firstImg.png" }) {
childImageSharp {
fluid(maxWidth: 300) {
...GatsbyImageSharpFluid
}
}
}
secondImg: file(
relativePath: { eq: "secondImg.png" }
) {
childImageSharp {
fluid(maxWidth: 300) {
...GatsbyImageSharpFluid
}
}
}
}
`)
switch (props.name) {
case "firstImg":
return <Img fluid={data.firstImg.childImageSharp.fluid} />
case "secondImg":
return <Img fluid={data.secondImg.childImageSharp.fluid} />
default:
return <Img />
}
}
and use it like this:
<Image name="firstImg" />
You can also make it typo-safe by introducing an object with all the images you might want to display, like this:
const Images = { firstImg: 'firstImg', secondImg: 'secondImg' }
and then use it like this:
<Image name={Images.firstImage} />
and
...
switch (props.name) {
case Images.firstImage:
...
Check the docs for static query
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
So you might want to query for the image's GatsbyImageSharpFluid
in your page query and pass it as the fluid prop directly to gatsby image.
Using ksav answer I managed to make this work by using pageQuery and receive the images i want to use in a specific page through props.
Like this:
export const pageQuery = graphql`
coverImage: file(relativePath: { eq: "coverImage.png" }) {
childImageSharp {
fluid(maxWidth: 600) {
...GatsbyImageSharpFluid_tracedSVG
}
}
}
}`
If you add this to your page component you will receive the props coverImage with the coverImage.png image. Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With