在 Gatsby 中迭代包括图像在内的数据
iterating over data including image in Gatsby
在 Gatsby 中,我想遍历一个包含对象的数组。每个对象的属性之一是图像。我希望能够使用 Gatsby 图像。
下面是我想要这样做的一个例子:网站上的一个页面有一个图片库,点击每个图片都会打开一个特定的关联视频。也许我想要数组中的 20、50 甚至 100 多个对象:
const videos = [
{
id: 1,
name: 'Festival 2018',
url: 'https://www.youtube.com',
img: // HOW TO ACHIEVE?
},
// Many more objects
]
videos.map((item) => {
return (
<Img
key={item.id}
fluid= // HOW TO ACHIEVE?
alt={item.name}
onClick={() => openPlayer(item.url)}
/>
)
})
我了解如何使用 GraphQL 查询单张图片;或者如何查询多个图像并使用别名;或者如何查询文件夹中的所有图像。但我还没有想出如何实现我的目标。可能有更好的方法。提前致谢。
要在 gatsby-image
中使用内部图像,您需要使用 gatsby-source-filesystem
允许 Gatsby 及其转换器和锐器知道图像所在的位置。这将从您的图像创建可查询的节点,并允许您对它们使用 gatsby-image
。
适用于您的情况,您需要将所有图像放在同一个文件夹中,比方说 /src/images
和:
const path = require(`path`)
module.exports = {
plugins: [
{
resolve: `gatsby-source-filesystem`,
options: {
name: `images`,
path: path.join(__dirname, `src`, `images`),
},
},
`gatsby-plugin-sharp`,
`gatsby-transformer-sharp`,
],
}
在那里,您的 JSON 对象将如下所示:
const videos = [
{
id: 1,
name: 'Festival 2018',
url: 'https://www.youtube.com',
img: '/relative/path/to/your/image.extension',
extension: 'png'
},
// Many more objects
]
注:谢谢John for the clarification about the extension
field. Source:
在您的情况下,由于您使用的是基于 JSON 的来源,因此您需要添加 gatsby-transformer-plugin
。配置将如下所示:
module.exports = {
plugins: [
`gatsby-transformer-json`,
{
resolve: `gatsby-source-filesystem`,
options: {
path: `./src/data/`,
},
},
],
}
注意:假设JSON放在/src/data
同时假设您的 JSON 文件名为 data.json
,如果一切设置正确,Gatsby 将创建一个名为 allDataJson
的 GraphQL 节点。那么你只需要最后创建一个包含以下内容的查询(页面查询或静态查询):
{
allDataJson {
edges {
node {
name
url
id
img {
childImageSharp {
fluid(maxWidth: 1000, quality: 100) {
...GatsbyImageSharpFluid
}
}
}
}
}
}
}
注意:请在 localhost:8000/___graphql
playground
中检查您的确切查询
如果您的路径正确,Gatsby 将创建 childImageSharp
节点,这将允许您在 gatsby-image
功能中使用您自己的内部图像。由于您查询的数据存储在 props.data
中,因此您的最终循环应如下所示:
props.data.allDataJson.edges.node.map((item) => {
return (
<Img
key={item.id}
fluid={item.img.childImageSharp.fluid}
alt={item.name}
onClick={() => openPlayer(item.url)}
/>
)
})
在 Gatsby 中,我想遍历一个包含对象的数组。每个对象的属性之一是图像。我希望能够使用 Gatsby 图像。
下面是我想要这样做的一个例子:网站上的一个页面有一个图片库,点击每个图片都会打开一个特定的关联视频。也许我想要数组中的 20、50 甚至 100 多个对象:
const videos = [
{
id: 1,
name: 'Festival 2018',
url: 'https://www.youtube.com',
img: // HOW TO ACHIEVE?
},
// Many more objects
]
videos.map((item) => {
return (
<Img
key={item.id}
fluid= // HOW TO ACHIEVE?
alt={item.name}
onClick={() => openPlayer(item.url)}
/>
)
})
我了解如何使用 GraphQL 查询单张图片;或者如何查询多个图像并使用别名;或者如何查询文件夹中的所有图像。但我还没有想出如何实现我的目标。可能有更好的方法。提前致谢。
要在 gatsby-image
中使用内部图像,您需要使用 gatsby-source-filesystem
允许 Gatsby 及其转换器和锐器知道图像所在的位置。这将从您的图像创建可查询的节点,并允许您对它们使用 gatsby-image
。
适用于您的情况,您需要将所有图像放在同一个文件夹中,比方说 /src/images
和:
const path = require(`path`)
module.exports = {
plugins: [
{
resolve: `gatsby-source-filesystem`,
options: {
name: `images`,
path: path.join(__dirname, `src`, `images`),
},
},
`gatsby-plugin-sharp`,
`gatsby-transformer-sharp`,
],
}
在那里,您的 JSON 对象将如下所示:
const videos = [
{
id: 1,
name: 'Festival 2018',
url: 'https://www.youtube.com',
img: '/relative/path/to/your/image.extension',
extension: 'png'
},
// Many more objects
]
注:谢谢John for the clarification about the extension
field. Source:
在您的情况下,由于您使用的是基于 JSON 的来源,因此您需要添加 gatsby-transformer-plugin
。配置将如下所示:
module.exports = {
plugins: [
`gatsby-transformer-json`,
{
resolve: `gatsby-source-filesystem`,
options: {
path: `./src/data/`,
},
},
],
}
注意:假设JSON放在/src/data
同时假设您的 JSON 文件名为 data.json
,如果一切设置正确,Gatsby 将创建一个名为 allDataJson
的 GraphQL 节点。那么你只需要最后创建一个包含以下内容的查询(页面查询或静态查询):
{
allDataJson {
edges {
node {
name
url
id
img {
childImageSharp {
fluid(maxWidth: 1000, quality: 100) {
...GatsbyImageSharpFluid
}
}
}
}
}
}
}
注意:请在 localhost:8000/___graphql
playground
如果您的路径正确,Gatsby 将创建 childImageSharp
节点,这将允许您在 gatsby-image
功能中使用您自己的内部图像。由于您查询的数据存储在 props.data
中,因此您的最终循环应如下所示:
props.data.allDataJson.edges.node.map((item) => {
return (
<Img
key={item.id}
fluid={item.img.childImageSharp.fluid}
alt={item.name}
onClick={() => openPlayer(item.url)}
/>
)
})