Интерполяция строк в запросе graphQL

Я новичок в Gatsby и его системе запросов graphQL для извлечения активов. У меня есть рабочий компонент Image, который извлекает изображение и отображает его. Я хочу, чтобы имя изображения можно было настроить, но я не могу понять, как это сделать.

Вот рабочий компонент:

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} />}
  />
);

И вот что я пытался сделать для настраиваемого изображения:

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} />}
  />
);

Но это вызывает следующую ошибку для запроса:

Expected 1 arguments, but got 2.ts(2554)

Как я могу иметь настраиваемое имя изображения?

Поведение ключевого слова "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) для оценки ваших знаний,...
9
0
6 881
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проверить документы для статического запроса

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

Таким образом, вы можете запросить изображение GatsbyImageSharpFluid в запросе страницы и передать его в качестве гибкой опоры непосредственно в изображение Гэтсби.

Мне не удалось заставить это работать, но ваш ответ актуален. Спасибо!

Baboo 14.05.2019 20:33

Используя ответ ksav, мне удалось выполнить эту работу с помощью pageQuery и получить изображения, которые я хочу использовать на определенной странице, через реквизит.

Так:

export const pageQuery = graphql`
  coverImage: file(relativePath: { eq: "coverImage.png" }) {
    childImageSharp {
      fluid(maxWidth: 600) {
        ...GatsbyImageSharpFluid_tracedSVG
      }
    }
  }
}`

Если вы добавите это к компоненту своей страницы, вы получите реквизит coverImage с изображением coverImage.png. Надеюсь это поможет!

Ответ принят как подходящий

Вот простой способ, с которым я столкнулся:

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 />
  }
}

и используйте его так:

<Image name = "firstImg" />

Вы также можете сделать его безопасным для опечаток, введя объект со всеми изображениями, которые вы хотите отобразить, например:

const Images = { firstImg: 'firstImg', secondImg: 'secondImg' }

а затем используйте его следующим образом:

<Image name = {Images.firstImage} />

а также

...
switch (props.name) {
case Images.firstImage:
...

Очень удобно

Baboo 27.08.2020 09:32

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