在 Gatsby 中使用 Graphql 和 Contentful 时图像不显示,道具类型失败:类型为“数字”的道具“图像”无效,预期为“对象”?

Posted

技术标签:

【中文标题】在 Gatsby 中使用 Graphql 和 Contentful 时图像不显示,道具类型失败:类型为“数字”的道具“图像”无效,预期为“对象”?【英文标题】:Image not displaying when using Graphql and Contentful in Gatsby, Failed prop type: Invalid prop `image` of type `number` expected `object`? 【发布时间】:2021-10-24 14:37:58 【问题描述】:

我一直在尝试通过 Graphql 成功查询 Contentful,以便在我的 gatsby 项目中访问和显示图像。

我的代码如下:

import * as React from "react"
import  graphql  from "gatsby"
import  GatsbyImage  from "gatsby-plugin-image"


function MainApp( data ) 

  return (
    <>  
      data.allContentfulHeroImage.edges.map(( node , index) => <GatsbyImage image=index ...node.heroImage alt=`` key=`` />)
    </>
  )


export default MainApp;

export const query = graphql 
`query MyQuery 
  allContentfulHeroImage 
    edges 
      node 
        heroImage 
          fluid (maxWidth: 2000) 
            ...GatsbyContentfulFluid
          
        
      
    
  
`

运行 gatsby build 时,我的网站编译正常,甚至显示网页,但似乎没有显示任何图像,而是空间为空。

查看控制台时会抛出错误消息:

**

警告:失败的道具类型:无效的道具image 类型为number 提供给GatsbyImage,预期object

**

我已尝试通过搜索错误消息的其他示例以及似乎与 childImageSharp 相关的唯一解决方案来解决此问题?

我正在寻找的解决方案在这里:

Gatsby-Image failed prop type

我尝试使用此方法更改我的查询,但没有成功,我也怀疑它是否适用于我的案例,因为在浏览 http 中的资源管理器时 childImageSharp 未列为我的查询的子项://localhost:8000/___graphql.

有没有其他人遇到过这个问题并知道解决方案?

【问题讨论】:

【参考方案1】:

您正在混合 Gatsby 图像版本之间的概念。

您的 GraphQL 查询正在获取 v2 图像

您的组件需要 v3 数据

为什么?因为你使用的fragment是从version 2 of Gatsby Image中提取出来的,而新版本(版本3)是GatsbyImage component只有版本3才有。

此外,您将一个数字 (index) 传递给 image 属性,这不是组件所期望的。

找出gatsby-imagegatsby-plugin-image 之间的区别。

解决方案很明显,使用一个或另一个。

使用gatsby-image (v2)

import * as React from "react"
import  graphql  from "gatsby"
import Img from "gatsby-image"


function MainApp( data ) 

  return (
    <>  
      data.allContentfulHeroImage.edges.map(( node , index) => <Img fluid=node.heroImage.fluid alt=`` key=`` />)
    </>
  )


export default MainApp;

export const query = graphql 
`query MyQuery 
  allContentfulHeroImage 
    edges 
      node 
        heroImage 
          fluid (maxWidth: 2000) 
            ...GatsbyContentfulFluid
          
        
      
    
  
`

注意import Img from "gatsby-image"

使用gatsby-plugin-image (v3)

import * as React from "react"
import  graphql  from "gatsby"
import  GatsbyImage  from "gatsby-plugin-image"


function MainApp( data ) 

  return (
    <>  
      data.allContentfulHeroImage.edges.map(( node , index) => <GatsbyImage image=node.heroImage.gatsbyImageData alt=`` key=`` />)
    </>
  )


export default MainApp;

export const query = graphql 
`query MyQuery 
  allContentfulHeroImage 
    edges 
      node 
        heroImage 
           gatsbyImageData(
             width: 200
             placeholder: BLURRED
             formats: [AUTO, WEBP, AVIF]
           )
          
        
      
    
  
`

像往常一样,在 GraphiQL 游乐场 (localhost:8000/___graphql) 中检查这两个查询。

这两种方法的可用性将取决于您安装的依赖项。检查两种情况下的要求(安装打包等)

【讨论】:

【参考方案2】:

我不熟悉GatsbyImage,但我相信你的问题很清楚。

<GatsbyImage image=index ...node.heroImage alt=`` key=`` />

您在此处将image 定义为index。我猜在正常情况下,image 通常需要对象的uri。它可以与GatsbyImage 不同,但至少不会是index

【讨论】:

以上是关于在 Gatsby 中使用 Graphql 和 Contentful 时图像不显示,道具类型失败:类型为“数字”的道具“图像”无效,预期为“对象”?的主要内容,如果未能解决你的问题,请参考以下文章

在 Gatsby、GraphQL 和 Sanity 中使用 _raw 和普通数据进行推理

Gatsby 和 GraphQL - 如何在查询中过滤数组

如何使用 reactjs 和 graphql 在 gatsby 中映射嵌套数组

如何使用 gatsby-source-prismic 在 graphql 中执行嵌套查询

Gatsby:在页面上组合两个 graphql 源(.json 和 .jpg 源)

使用 gatsby-source-graphql 时,GraphIQL 资源管理器未在 Gatsby 中显示