#reactjs #graphql #gatsby #graphiql
#reactjs #graphql #gatsby #graphiql
Вопрос:
У меня есть проект Gatsby, созданный с помощью Gatsby-Ghost-Starter. Я пытаюсь получить доступ к данным сообщения в блоге из Ghost в файле шаблона Gatsby. Я успешно получаю доступ к некоторым данным, но у меня проблемы с доступом к вложенным данным GraphQL.
Используя интерфейс Graphiql, это данные, которые я пытаюсь получить:
query MyQuery {
allGhostPost {
edges {
node {
id
slug
tags {
id
slug
meta_title
name
}
}
}
}
}
Вот как выглядит мой запрос в моем шаблоне Gatsby:
export const pageQuery = graphql`
query GhostPostQuery($limit: Int!, $skip: Int!) {
allGhostPost(
sort: { order: DESC, fields: [published_at] },
limit: $limit,
skip: $skip
) {
edges {
node {
...GhostPostFields
}
}
}
}
`
Вот мой компонент шаблона Gatsby:
const Blog = ({ data, location, pageContext }) => {
const posts = data.allGhostPost.edges
const { pageNumber } = pageContext
const { humanPageNumber } = pageContext
const { numberOfPages } = pageContext
// Dot notation here results in an error, how can I access the name property?
const id = data.allGhostPost.edges.node.tags.name
return (
<React.Fragment>
<MetaData location={location} />
<Layout>
<div className={styles.container}>
<section className={styles.postFeed}>
{posts.map(({ node }) => (
// The tag below includes the markup for each post - components/common/PostCard.js
<PostCard key={node.id} post={node} />
))}
</section>
<Pagination pageContext={pageContext} />
</div>
</Layout>
</React.Fragment>
);
};
Как я могу получить доступ к данным, вложенным в объекты ребер / узлов? Мой запрос GraphQL неверен или есть проблема с тем, как я пытаюсь получить к нему доступ с помощью точечной нотации?
Например, как я могу получить name
или meta_title
?
Комментарии:
1. консоль. регистрируйте шаг за шагом …. вероятно, массивы в «цепочке»… Я думаю
const id = data.allGhostPost.edges[0].node.tags[0].name
?2. Это сделало свое дело. Изменение индекса массива ребер позволяет мне получать имена тегов, т.е. const id = data.allGhostPost.edges[1].node.tags[0].name, const id = data.allGhostPost.edges[2].node.tags[0].name и т.д… Спасибо.
3. … если вам это нужно вне «основного цикла»…. почему бы просто не перейти
node.tags
в<PostCard />
(например, использоватьprops.tags.map()
для отображения тегов внутри)?
Ответ №1:
Я немного смущен тем, о чем вы спрашиваете. У вас есть цикл posts
, в котором хранится вся информация. Просто получите к нему доступ с помощью:
{posts.map(({ node }, index) => {
console.log('tag name:', node.tags[index].name)
return <PostCard key={node.id} post={node} />
})}
Просто доступ к вложенным свойствам в вашем posts
.