不显示 gatsby-source-medium 缩略图

gatsby-source-medium thumbnail image not showing

我在我的 React 项目中使用 gatsby,以展示我的媒介,项目中的文章。

下面是我的 graphql 查询。

const BlogPost = () => {
  const blogMediumQueryData = useStaticQuery(graphql`
    query Medium {
      allMediumPost(sort: { fields: [createdAt], order: DESC }) {
        edges {
          node {
            id
            title
            uniqueSlug
            createdAt(formatString: "MMM YYYY")
            virtuals {
              previewImage {
                imageId
              }
            }
            author {
              name
            }
          }
        }
      }
    }
  `)

  const blogs = blogMediumQueryData.allMediumPost.edges
return (
    <Blog
        image={blog.node.virtuals.previewImage.imageId}
        title={blog.node.title}
        date={blog.node.createdAt}
        author={blog.node.author.name}
        path={blog.node.uniqueSlug}
     />
  )

这给了我预览图像 ID。我将它作为道具传递给子组件。但是当我尝试使用来自 gatsby 的 Img 组件显示图像时,图像没有显示。

这是我的子组件代码

import React from "react"
import { Link } from "gatsby"
import { slugify } from "../utils/utilityFunctions"
import Image from "../elements/image"

const Blog = ({ image }) => {
  return (
    <div className="content-block">
      <div className="post-thubnail">
        {image && (
          <Link to={postUrl} target='blank'>
            <Image src={image} alt={title} />
          </Link>
        )}
      </div>
  )
}
export default Blog

这是图像组件的代码

import React from "react";
import Img from "gatsby-image";

const NonStretchedImage = props => {
    let normalizedProps = props
    normalizedProps = {...normalizedProps.fluid, aspectRatio: 1}
    let alignment;
    if(props.align === 'right'){
        alignment = '0 0 0 auto'
    } else if(props.align === 'left'){
        alignment = '0 auto 0 0'
    }else{
        alignment = '0 auto'
    }

    if (props.fluid && props.fluid.presentationWidth) {
        normalizedProps = {
            ...props,
            style: {
                ...(props.style || {}),
                maxWidth: props.fluid.presentationWidth,
                margin: alignment, 
            },
        }
    }

    return <Img {...normalizedProps} />
}

export default NonStretchedImage;

这是我第一个使用 gatsby 和 graphql 的项目。有什么我遗漏的或有什么我做错的吗?

提前致谢

我想一些注意事项会让您走上解决问题的轨道。

node,在GraphQL查询中是一个数组,同理,我猜virtuals是。在 localhost:8000/___graphql 游乐场检查并测试响应。

因此假设您的查询按预期工作,您的代码应如下所示:

const BlogPost = () => {
  const blogMediumQueryData = useStaticQuery(graphql`
    query Medium {
      allMediumPost(sort: { fields: [createdAt], order: DESC }) {
        edges {
          node {
            id
            title
            uniqueSlug
            createdAt(formatString: "MMM YYYY")
            virtuals {
              previewImage {
                imageId
              }
            }
            author {
              name
            }
          }
        }
      }
    }
  `)

  const blogs = blogMediumQueryData.allMediumPost.edges
return (
    <Blog
        image={blog.node[0].virtuals.previewImage.imageId}
        title={blog.node[0].title}
        date={blog.node[0].createdAt}
        author={blog.node[0].author.name}
        path={blog.node[0].uniqueSlug}
     />
  )

或者,您可以遍历节点数组并使用之前的 Blog 组件,因为它将获取每个可迭代变量。

我认为您的 Image 组件仅使用 imageId 无法呈现 gatsby-image。 Gatsby 需要一堆数据(由它的 transformers 和 sharps 提供)来渲染图像,而不是使用标识符而是一系列字段(这就是它通常渲染查询片段的原因,由 ... 指出)。最后,您的图像组件应该呈现如下内容:

<img src={`https://medium.com/${blog.node[0].virtuals.previewImage.imageId}`}

基于:https://blog.devgenius.io/how-to-scrap-your-medium-articles-with-gatsby-js-f35535ebc09d

总而言之,gatsby-source-medium 本身并不能提供足够的数据来使用 gatsby-imagegatsby-image-plugin 插件,所以恐怕您将无法使用 Img组件。您必须使用标准 img 标签。