Ты не слишком далеко.GraphQL поддерживает несколько дискретных узлов, запрашиваемых в одном запросе:
export const query = graphql`
{
products: allMarkdownRemark(
filter: { frontmatter: { type: { eq: "product" } } }
) {
edges {
# ...
}
}
pages: allMarkdownRemark(
filter: { frontmatter: { type: { eq: "pages" } } }
) {
edges {
# ...
}
}
}
`
Обратите внимание, что я использовал псевдонимы для извлечения одного и того же начального узла (allMarkdownRemark
) с отдельными фильтрами в одном и том же запросе GraphQL.Это приведет к тому, что data.products
и data.pages
будут переданы в default
экспортированный компонент React.
Чтобы очистить это, вы можете использовать фрагменты, что позволит вам объединить ваш запрос products
в вашем Carousel
файл:
В carousel.js
(или любом другом файле, в котором находится ваш компонент Карусели):
export const query = graphql`
fragment Products on Query {
products: allMarkdownRemark(
filter: { frontmatter: { type: { eq: "product" } } }
) {
edges {
# ...
}
}
}
`
Затем в вашем файле подкачки:
export const query = graphql`
{
pages: allMarkdownRemark(
filter: { frontmatter: { type: { eq: "pages" } } }
) {
edges {
# ...
}
}
...Products
}
`
Примечание:если вы используете Gatsby 1.x, вам нужно изменить часть фрагмента on Query
на on RootQueryType
.
Предполагая, что вы используете Gatsby v2, вы также можете использовать StaticQuery вместо объединения запроса в один.Это особенно полезно, если ваши страницы не имеют отношения к карусели товаров.
import React from "react";
import { graphql, StaticQuery } from "gatsby";
class Carousel extends React.Component {
// ...
}
export default props => (
<StaticQuery
query={graphql`
products: allMarkdownRemark(
filter: { frontmatter: { type: { eq: "product" } } }
) {
edges {
# ...
}
}
`}
render={({ products }) => <Carousel products={products} {...props} />}
/>
);