Как получить доступ к определенному элементу из массива без итерации?

У меня следующая структура папок

/images
/images/pic1.jpg
/images/pic2.jpg

При использовании следующего запроса GraphQL..

query MyQuery1 {
  file(sourceInstanceName: {eq: "images"}, name: {eq: "pic1"}) {
    name
    publicURL
  }
}

К результату можно получить доступ, используя что-то вроде <img src={data.file.publicUrl} alt="" />. Все идет нормально.

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

query {
  allFile(
    filter: {
      sourceInstanceName: { eq: "images" }
      name: { in: ["pic1", "pic2"] }
    }
  ) {
    nodes {
      name
      publicURL
    }
  }
}

Большой! Но как теперь я могу получить доступ к одному из этих изображений, не используяmap или перебрать результат?

Я ищу что-то вроде этого, что, конечно, не работает:

<img src={data.file.publicUrl name.eq="pic1"} alt="pic1"/>

Ничего подобного тоже не бывает:

<img src={data.allFile.nodes.0.publicUrl} alt="pic1" />

Я бы хотел использовать gatsby-imageдля оптимизации и изменения размера моих изображений. Вот почему я предпочитаю GraphQL прямому импорту. Я ошибаюсь?

2 ответа

Решение

Я разобрался сам. Я не знал, что можно связать все вместе. Это сработало для меня.

query {
  imageOne: file(sourceInstanceName: {eq: "images"}, relativePath: {eq: "pic1.jpg"}) {
    id
    childImageSharp {
      fixed(width: 30) {
        base64
        tracedSVG
        aspectRatio
        width
        height
        src
        srcSet
        srcWebp
        srcSetWebp
        originalName
      }
    }
  }
  imageTwo: file(sourceInstanceName: {eq: "images"}, relativePath: {eq: "pic2.jpg"}) {
    id
    childImageSharp {
      fixed(width: 30) {
        base64
        tracedSVG
        aspectRatio
        width
        height
        src
        srcSet
        srcWebp
        srcSetWebp
        originalName
      }
    }
  }
}

А затем откройте его так:

<Img fixed={data.imageOne.childImageSharp.fixed} alt="" />

а также

<Img fixed={data.imageTwo.childImageSharp.fixed} alt="" />

PS: Это релевантная часть внутри gatsby-config.js

{
  resolve: `gatsby-source-filesystem`,
  options: {
    name: `images`, <<== gets filtered by sourceInstanceName: ..
    path: `${__dirname}/src/images/`,
  },
},
`gatsby-transformer-sharp`,
`gatsby-plugin-sharp`,

OP ответил на свой вопрос, но вот другой способ: использовать Array.prototype.filter

const Index = (props) => {
  const { data: { allFile: { edges } } } = props;

  const heroImage = edges.filter
    (el => el.node.childImageSharp.fluid.originalName === "heroImage.png")
      [0].node.childImageSharp.fluid;
  // ...
}

export const query = graphql`
{
  allFile(filter: {
    extension: {eq: "png"},
    sourceInstanceName: {eq: "images"}},
    sort: {fields: [childImageSharp___fluid___originalName], order: ASC})
  {
    edges {
      node {
      childImageSharp {
          fluid(maxWidth: 300, quality: 50) {
            originalName
            ...GatsbyImageSharpFluid
          }
        }
      }
    }
  }
}
`;

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