使用 Gatsby/Contentful 从 Graphql 获取参考数据
Getting reference data from Graphql using Gatsby/Contentful
我正在努力从我的 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]
假设 Islands
和 featuredActivities
不是数组或对象,并且您正在从 GraphQL 查询中获取正确的数据,您只需要更正解构和使用这些值的方式。此外,由于您不能有冲突的变量名称,因此您必须重命名 featuredActivities
中的变量
const PageTemplate = ({
data: {
islands: {
id, title
featuredActivities: { id: featuredId , title: featuredTitle },
},
},
...
<article key={featuredId}>
<h3>{featuredTitle}</h3>
</article>
And now I want to get the data for this part of the query
您不能像这样解构数组的所有项目:
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
,可迭代变量),title
和id
(其余所需字段依此类推)。
我正在努力从我的 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]
假设 Islands
和 featuredActivities
不是数组或对象,并且您正在从 GraphQL 查询中获取正确的数据,您只需要更正解构和使用这些值的方式。此外,由于您不能有冲突的变量名称,因此您必须重命名 featuredActivities
const PageTemplate = ({
data: {
islands: {
id, title
featuredActivities: { id: featuredId , title: featuredTitle },
},
},
...
<article key={featuredId}>
<h3>{featuredTitle}</h3>
</article>
And now I want to get the data for this part of the query
您不能像这样解构数组的所有项目:
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
,可迭代变量),title
和id
(其余所需字段依此类推)。