Переменные в запросах graphQL

Обновлено: теперь с рабочим кодом ниже

Версия GraphiQL

У меня есть этот запрос для получения Гэтсби-образ:

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.

Версия Гэтсби

Теперь я хочу использовать его в Gatsby, поэтому у меня есть следующий код:

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

Что я делаю неправильно?

Обновлено:

Рабочая версия

Спасибо за помощь! Следующий код работает очень хорошо. Этот Почта был особенно полезен. Это не идеальное решение, но у меня оно работает.

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;

Большое спасибо за предоставленную рабочую версию! Вы сэкономили мне часы работы.

EliteRaceElephant 11.08.2019 08:31

В любом случае передать maxWidth: 1000 или фрагмент (GatsbyImageSharpFluid) в качестве переменной. Это сделало бы его более динамичным.

rjvim 27.01.2020 09:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
17
2
12 995
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Итак, чтобы передавать переменные, вы должны использовать следующий синтаксис

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"}
   )

Примечание: это будет работать только в файле gatsby-node, передача переменной в метод graphql со статическим запросом (например) не позволит использовать переменные.

kylegill 20.07.2020 16:27
Ответ принят как подходящий

Два ответа (от Бенса и Нимиша) неверны в этом контексте, они не относятся к Гэтсби.

Если вы хотите использовать переменные в запросах GraphQL, вы должны передать их через контекст в функции createPage в gatsby-node.js, как описано здесь: https://www.gatsbyjs.org/docs/programmatically-create-pages-from-data/

В настоящее время вы не можете использовать другие переменные, например взгляните на это обсуждение: https://spectrum.chat/?t=abee4d1d-6bc4-4202-afb2-38326d91bd05

К сожалению, это так. Я добавил рабочий код на основе этой второй ссылки.

crowhill 17.12.2018 07:37

Другие вопросы по теме