使用 Gatsby/Contentful 从 Graphql 获取参考数据

Posted

技术标签:

【中文标题】使用 Gatsby/Contentful 从 Graphql 获取参考数据【英文标题】:Getting reference data from Graphql using Gatsby/Contentful 【发布时间】:2021-07-01 22:38:50 【问题描述】:

我正在努力从我的 Graphql 的参考部分获取数据。我得到了一个 Contentful 内容模型,其中包含参考,您可以在下面的查询中看到。

现在,我得到了一个像这样的简单页面,我在其中从 Contentful 查询数据:

import React from "react"
import  graphql  from "gatsby"

const PageTemplate = (
    data: 
        islands: 
            id,
            title,
            featuredActivities:  id, title ,
        ,
    ,
) => 


    return (
                                    <article key=id>
                                        <div>
                                            <h3>title</h3>
                                        </div>
                                    </article>

                                    <article key=featuredActivities.id>
                                        <div>
                                            <h3>featuredActivities.title</h3>
                                        </div>
                                    </article>
    )


export const query = graphql`
query GetSinglePage($slug: String) 
  islands: contentfulPage (slug: eq: $slug) 
        id
        title
        featuredActivities 
            id
            title
            category
            price
            image 
              fluid 
                ...GatsbyContentfulFluid
              
            
          
      
  
`
export default PageTemplate

现在我想获取这部分查询的数据:

featuredActivities 
            id
            title
            category
            price
            image 
              fluid 
                ...GatsbyContentfulFluid
              
            
          

我试过了:

const PageTemplate = (
    data: 
        islands: 
            featuredActivities:  id ,
            featuredActivities:  title ,
        ,
    ,

并像这样将它添加到:

<article key=featuredActivities.id>
  <h3>featuredActivities.title</h3>
</article>

但它不起作用,有人知道我做错了什么吗?

提前致谢

[![在此处输入图片描述][1]][1]

【问题讨论】:

不工作是什么意思?你收到什么错误? 内容不显示。 FeaturedActivity 和 island 似乎都将是一个数组? 那么如何从 FeaturedActivities 获取数据? 【参考方案1】:

现在我想获取这部分查询的数据

你不能像这样解构数组的所有项:

const PageTemplate = (
    data: 
        islands: 
            featuredActivities:  id ,
            featuredActivities:  title ,
        ,
    ,

为什么?因为它是一个对象数组,并且结构 () 与嵌套项的类型不匹配。而且,如果是的话,您将需要输入每个特定位置。

您可能需要:

const PageTemplate = (
    data: 
        islands: [
            featuredActivities:  id ,
            featuredActivities:  title ,
        ],
    ,

注意环绕方括号 ([])。

但是,正如我所说,这并不理想,因为您需要打印未知长度数组的每个特定位置。最好和最优的解决方案是解构直到featuredActivities 并循环遍历所有元素:

const PageTemplate = (
    data: 
        islands: 
            id,
            title,
            featuredActivities,
        ,
    ,
) => 


    return <>
     featuredActivities.map((title, id)=>
       return <div key=id>title</div>
     )
    </>

这样,您可以在 (title, id) 中的同一循环内解构,因为您正在获取每个特定位置(featuredActivity,可迭代变量)、titleid(等等其余必填字段)。

【讨论】:

【参考方案2】:

假设 IslandsfeaturedActivities 不是数组或对象,并且您从 GraphQL 查询中获取正确的数据,您只需要更正解构和使用这些值的方式。此外,由于您不能有冲突的变量名称,因此您必须从 featuredActivities 重命名变量

const PageTemplate = (
    data: 
        islands: 
            id, title
            featuredActivities:  id: featuredId , title: featuredTitle ,
        ,
    ,
    ...

    <article key=featuredId>
      <h3>featuredTitle</h3>
    </article>

【讨论】:

嗯,谢谢您的回复。我想我已经尝试过让我快速检查一下 当我这样做时出现此错误:27:35 错误解析错误:参数名称冲突 你是否也在解构岛屿的 id 和 title? 是的,我想从岛屿和特色活动中解构标题 我已经更新了问题中的代码,以便您更好地了解我想要做什么

以上是关于使用 Gatsby/Contentful 从 Graphql 获取参考数据的主要内容,如果未能解决你的问题,请参考以下文章

Gatsby + contentful + Netlify 的私人/登录部分

将 Gatsby + Contentful 网站部署到 Netlify

Gatsby Contentful-GraphQL查询错误:未知类型“ ContentfulFixed”

Gatsby + Contentful - 如何在不重新启动服务器的情况下在本地重做 GraphQL 查询(npm run dev)?

自定义 Gatsby / Contentful Schema

javascript gatsby / contentful - createContentTypePages