Изображение миниатюры gatsby-source-medium не отображается

Я использую 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}
     />
  )

это дает мне идентификатор изображения предварительного просмотра. И я передаю его дочернему компоненту как опору. Но когда я пытаюсь показать изображение с помощью компонента Img из gatsby, изображение не отображается.

Вот мой код для дочернего компонента

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. Что-то я пропустил или что-то делаю не так?

заранее спасибо


person Ayesh Nipun    schedule 30.05.2021    source источник


Ответы (1)


Несколько предостережений, которые, я думаю, помогут вам решить эту проблему.

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 компонент сможет отобразить gatsby-image только с imageId. Гэтсби нужен набор данных (предоставленных его преобразователями и точками) для рендеринга изображения, не используя идентификатор, а серию полей (поэтому он обычно отображает фрагменты запроса, отмеченные ...). В конце концов, ваш компонент изображения должен отображать что-то вроде:

<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-image или gatsby-image-plugin плагинов, поэтому я боюсь, что вы не сможете использовать Img компонент. Вы должны использовать стандартный тег img.

person Ferran Buireu    schedule 31.05.2021
comment
Большое спасибо, сэр. Это работает, как ожидалось. - person Ayesh Nipun; 31.05.2021