代码之家  ›  专栏  ›  技术社区  ›  crowhill

GRAPHQL查询中的变量

  •  0
  • crowhill  · 技术社区  · 6 年前

    编辑:现在使用下面的工作代码

    graphiql版本

    我有这个问题要问 gatsby-image :

    query getImages($fileName: String) {
      landscape: file(relativePath: {eq: $fileName}) {
        childImageSharp {
          fluid(maxWidth: 1000) {
            base64
            tracedSVG
            aspectRatio
            src
            srcSet
            srcWebp
            srcSetWebp
            sizes
            originalImg
            originalName
          }
        }
      }
    }
    

    然后这个查询变量:

    {
      "fileName": "titanic.jpg"
    }
    

    以上工作在 GraphiQL .

    盖茨比版本

    现在我想在盖茨比使用它,所以我有以下代码:

    import React from "react"
    import { graphql } from "gatsby"
    import Img from "gatsby-image"
    
    export default ({ data }) => (
      <div>
        <Img fluid={data.landscape.childImageSharp.fluid} />
      </div>
    )
    
    export const query = (
      graphql`
        query getImages($fileName: String) {
          landscape: file(relativePath: {eq: $fileName}) {
            childImageSharp {
              fluid(maxWidth: 1000) {
                base64
                tracedSVG
                aspectRatio
                src
                srcSet
                srcWebp
                srcSetWebp
                sizes
                originalImg
                originalName
              }
            }
          }
        }
      `,
      {fileName: "knight.jpg"}
    )
    

    以上不起作用。 data.landscape.childImageSharp === null

    我做错什么了?

    编辑:

    工作版本

    谢谢你的帮助!下面的代码工作得很好。这个 post 特别有用。这不是一个理想的解决方案,但它对我有效。

    import React from 'react';
    import Img from 'gatsby-image';
    import { StaticQuery, graphql } from 'gatsby';
    
    function renderImage(file) {
      return (
        <Img fluid={file.node.childImageSharp.fluid} />
      )
    }
    
    const MyImg = function (props) {
    
      return <StaticQuery
        query={graphql`
          query {
            images: allFile(filter: { sourceInstanceName: { eq: "images" } }) {
              edges {
                node {
                  extension
                  relativePath
                  childImageSharp {
                  fluid(maxWidth: 1000) {
                    ...GatsbyImageSharpFluid
                  }
                }
              }
            }
          }
        }
        `}
        render={(data) => {
          const image = data.images.edges.find(
            image => image.node.relativePath === "knight.jpg"
          )
          return(renderImage(image))
        }}
      />
    }
    
    export default MyImg;
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   LekoArts    6 年前

    这两个答案(本斯和尼米什的)在这方面是错误的,它们不是盖茨比特有的。

    如果要在graphql查询中使用变量,则必须通过 createPage 功能在 gatsby-node.js 如本文所述: https://www.gatsbyjs.org/docs/programmatically-create-pages-from-data/

    您当前不能使用超出此范围的变量,例如,请查看此讨论: https://spectrum.chat/?t=abee4d1d-6bc4-4202-afb2-38326d91bd05

        2
  •  -1
  •   Nimish Gupta    6 年前

    因此,要传递变量,必须使用以下语法

    graphql(`<your_query_with_variable>`, { indexPage: <value_of_variable> })
    

    所以查询会是这样的

    export const query = grapqhl(
     `query getImages($fileName: String) {
      landscape: file(relativePath: {eq: $fileName}) {
        childImageSharp {
          fluid(maxWidth: 1000) {
            base64
            tracedSVG
            aspectRatio
            src
            srcSet
            srcWebp
            srcSetWebp
            sizes
            originalImg
            originalName
           }
         }
       }
     }
    `,
    {fileName: "knight.jpg"}
    

    )