【问题标题】:How to get Gatsby Images based on results of PageQuery?如何根据 PageQuery 的结果获取 Gatsby 图片?
【发布时间】:2019-08-03 11:46:13
【问题描述】:

我想执行以下操作,以便动态获取 Gatsby 图像:

const image = 'gastby-astronaut.png';

export const imageQuery = graphql`
  { allImageSharp (
    filter: {
      fluid: {
        originalName: {
          regex: "/${image}/"
        }
      }
    }
  ){
  edges { 
    node {
      fluid {
        originalName
      }
    }
  }
}
}
`;

但是,我不知道如何将此查询连接到将获取“gatsby-astronaut.png”的初始查询,或从带有 .尝试此操作时出现此错误:

Error: BabelPluginRemoveGraphQL: String interpolations are not allowed 
in graphql fragments. Included fragments should be referenced as
 `...MyModule_foo`.

关于动态返回 Gatsby 图像的正确方法有什么建议吗?

【问题讨论】:

  • 感谢您联系我!

标签: graphql gatsby


【解决方案1】:

啊,是的,Gatsby 通过静态分析从您的页面中提取 GraphQL 查询:它们将文件作为文本加载、解析并提取查询,所有这些都在实际文件执行之前完成。这意味着您的典型标记模板文字功能不存在。

过滤的唯一方法是通过从gatsby-node.js 调用createPage 时提供的上下文。 IE。如果你这样做:

exports.createPages = ({ graphql, actions }) =>
  graphql(`some query here`).then(result => {
    actions.createPage({
      path: "/output-path/",
      component: path.resolve(`./src/templates/your_template.jsx`),
      context: { image: result.data.yourImage },
    })
  })

然后你可以在你的页面查询中这样做:

query SomePage($image: String!) {
  allImageSharp (
    filter: {
      fluid: {
        originalName: {
          regex: $image
        }
      }
    }
  ){
    edges { 
      node {
        fluid {
          originalName
        }
      }
    }
  }
}

【讨论】:

  • 我想知道 Gatsby 的这个新的 Schema Customization 是否也能解决这个问题:gatsbyjs.org/blog/2019-03-04-new-schema-customization ... createResolvers 就是我正在看的...
  • @EricJohnson 如果不知道你想要做什么,很难说,但我认为这对你没有帮助—createResolvers 允许你增加类型和节点,但不会改变 Gatsby 处理 GraphQL 查询的方式。
【解决方案2】:

这是我想出的一个解决方案...相当笨拙,但它有效:

import PropTypes from 'prop-types';
import React from 'react';
import Img from 'gatsby-image';
import { useStaticQuery, graphql } from 'gatsby';


const Image = ({ imageYouWant }) => {
  const data = useStaticQuery(
    graphql`
      query allTheImagesQuery{
        allImageSharp {
          edges {
            node {
              fluid(maxWidth:1000) {
                ...GatsbyImageSharpFluid
                originalName
              }
            }
          }
        }
      }`,
  );

  const TheImageYouWant = data.allImageSharp.edges
    .filter(edge => edge.node.fluid.originalName === imageYouWant)
    .map(myImage => <Img fluid={myImage.node.fluid} />);

  return (
    <>
      { TheImageYouWant }
    </>
  );
};


Image.propTypes = {
  imageYouWant: PropTypes.string,
};

Image.defaultProps = {
  imageYouWant: '',
};

export default Image;

【讨论】:

  • 您的其余内容是否没有通过 GraphQL 进行查询?通常您不需要这样做,因为您的文本内容和对图像的引用可以一起定义,并且您可以在路径节点内使用childImageSharp 来获取额外的清晰图像数据。
  • 我会试一试...我一开始在使用 GraphQL 语法时遇到了一些问题,所以也许我错过了什么!
  • @coreyward 是否需要一种特殊的方式在我的 JSON 中定义我的图像引用,以便 Gatsby 将它们识别为图像?
  • 当 Gatsby 启动时,它会根据您的数据推断节点类型;如果您有看起来像路径的字符串,Gatsby 将检查第一个字符串以查看该位置是否存在文件。如果是,则将该节点声明为文件。随后,gatsby-plugin-sharp 将在这些 File 节点下添加一个childImageSharp 节点。所以基本上你只需要在你的内容中有有效的路径引用。您是否使用特定的源插件来定义您的数据?
  • @coreyward 是的,我正在使用gatsby-source-filesystem,并且我安装了gatsby-plugin-sharp。我尝试将我的 JSON 中的路径更改为完整路径 /src/images/gatsby-icon.png/images/gatsby-icon.png 但它似乎仍然将其推断为字符串:screencast.com/t/Xw07RDpN5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2020-09-07
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2022-10-14
相关资源
最近更新 更多