使用 GraphQL 查询文件夹中的所有图像

IT技术 reactjs graphql gatsby
2021-05-08 04:44:08

我目前正在学习 Gatsby.js 和 GraphQL 作为补充技术,但在查询方面遇到了困难。我想从文件夹中查询所有图像,通过它们映射并在react组件中将它们显示为网格。我正在使用 gatsby-source-filesystem 但不知道如何具体解决该文件夹并从中获取所有图像。

我为源文件系统设置的插件如下所示。

{
  resolve: `gatsby-source-filesystem`,
  options: {
    path: `${__dirname}/src/posts`,
    name: 'posts',
  },
},
{
  resolve: `gatsby-source-filesystem`,
  options: {
    name: `images`,
    path: `${__dirname}/src/assets/images`,
  },
},
{
  resolve: `gatsby-source-filesystem`,
  options: {
    name: `photos`,
    path: `${__dirname}/src/assets/photos`,
  },
},

我在 src/assets/photos 中有我的图片

谢谢你的帮助!

2个回答

您可以使用 graphql 中的过滤器选择特定文件夹。

尝试这样的事情:

query AssetsPhotos {
  allFile(filter: {extension: {regex: "/(jpg)|(jpeg)|(png)/"}, relativeDirectory: {eq: "photos"}}) {
    edges {
      node {
        id
        name
      }
    }
  }
}

eq: photos应改为相对目录结果你得到你想要的目标,当你去GraphiQL和运行一个查询文件allFile

我喜欢sourceInstanceName在使用gatsby-source-filesystem插件文档中记录的插件时使用

你的 gatsby-config.js

{
  resolve: "gatsby-source-filesystem",
  options: {
    path: `${__dirname}/content/legal`,
    name: "legal", // IMPORTANT: the name of your source instance
  },
}, {
  resolve: "gatsby-source-filesystem",
  options: {
    path: `${__dirname}/content/blog`,
    name: "blog",
  },
}

然后,您可以使用filterand直接在 GraphQL 查询中解决它们sourceInstanceName

export const query = graphql`
{
  allFile(filter: {
      extension: {eq: "png"},
      sourceInstanceName: {eq: "blog"}
    })
  {
    edges {
      node {
      childImageSharp {
          fluid(maxWidth: 300, quality: 50) {
            originalName
            ...GatsbyImageSharpFluid
          }
        }
      }
    }
  }
}

与 相比relativeDirectory,通过这种方式,您永远不必处理更改的相对路径,您可能会重构您的项目或其他任何内容。就让 GraphQL 为您处理吧!