Как я могу отобразить ссылочные поля из содержимого в React?

#reactjs #graphql #gatsby #contentful

#reactjs #graphql #gatsby #содержимое

Вопрос:

Как я могу отображать данные из типов полей ссылок Contentful? Я могу запрашивать данные в graphql и даже использовать их в react для фильтрации сообщений на моем сайте с помощью;

 query TestQuery {
  allContentfulPost {
    edges {
      node {
        categories {
          title
          slug
        }
      }
    }
  }
}
 

Но когда я пытаюсь отобразить его для отображения на странице, он показывает пустые разделы. Однако я могу отображать все другие типы полей, не работает только поле ссылок.

Данные ссылочного поля в Contentful: Данные ссылочного поля в Contentful:

Данные ссылочного поля, полученные в graphql: Данные ссылочного поля, полученные в graphql:

Простой тестовый код:

 import React from "react"
import { useStaticQuery, graphql } from "gatsby"

import Layout from "../components/Layout.js"

const TestPage = () => {
  const data = useStaticQuery(graphql`
    query TestQuery {
      allContentfulPost {
        edges {
          node {
            categories {
              title
              slug
            }
          }
        }
      }
    }
  `)

  return (
    <Layout>
      {data.allContentfulPost.edges.map(({ node }) => {
        return (
          <div key={node.slug}>
            {node.categories.title}
            Reference fields should be here but their not 😭
          </div>
        )
      })}
    </Layout>
  )
}

export default TestPage
 

Данные ссылочного поля не отображаются в React:
Данные ссылочного поля не отображаются в React:

//

Обновить:

Я провел несколько проб и ошибок с фрагментами GraphQL, как было предложено Ферраном ниже, и я могу просматривать данные в localhost: 8000 / ___graphql с помощью;

 query TestQuery {
      allContentfulPost {
        edges {
          node {
            categories {
              ... on ContentfulCategory {
                title
                slug
              }
            }
          }
        }
      }
    }
 

Однако отображаемые divs по-прежнему пусты. Нужно ли мне изменить путь к источнику данных «{node.categories.title}» в функции возврата, чтобы он работал? Может быть, мне нужно добавить что-то между «node» и «categories», чтобы ссылаться на «… на contentfulкатегорию», добавленную в запрос graphql? Если да, то как я должен это написать? Я пробовал «{node.oncontentfulcategory.categories.title}», но это не сработало. Еще раз спасибо

 import React from "react"
import { useStaticQuery, graphql } from "gatsby"

import Layout from "../components/Layout.js"

const TestPage = () => {
  const data = useStaticQuery(graphql`
    query TestQuery {
      allContentfulPost {
        edges {
          node {
            categories {
              ... on ContentfulCategory {
                title
                slug
              }
            }
          }
        }
      }
    }
  `)

  return (
    <Layout>
      {data.allContentfulPost.edges.map(({ node }) => {
        return (
          <div key={node.slug}>
            {node.categories.title}
            What path should I now use for the data source in the line above?
          </div>
        )
      })}
    </Layout>
  )
}

export default TestPage
 

Ответ №1:

Вам нужно добавить фрагменты GraphQL в ваши запросы для доступа к ссылочным данным. У вас плохой пример в Gatsby docs ( gatsby-source-contentful ) или в некоторых других потоках GitHub.

Плагин выведет ссылки на вашу схему и создаст соответствующие узлы, что позволит вам использовать их в своих запросах для извлечения необходимых данных. Вы должны сделать несколько проб и ошибок в вашем localhost: 8000 / ___graphql, чтобы убедиться, что ваша модель работает правильно, без этого трудно угадать, как должен выглядеть запрос, но это должно быть что-то вроде этого:

   const data = useStaticQuery(graphql`
    query TestQuery {
      allContentfulPost {
        edges {
          node {
            categories {
                 title
                 slug
                 __typename
               ...on contentfulCategories{
                 #your category fields
              }
            }
          }
        }
      }
    }
  `)
 

Дополнительные ссылки / статьи:

Комментарии:

1. Спасибо, Ферран! Я все еще застрял. Пожалуйста, смотрите мой ответ ниже.

2. Отредактируйте свой пост вместо добавления нового ответа, пожалуйста. Это проще, чем это. Имена полей и свойства вложенности предоставляются localhost:8000/___graphql и для доступа к данным вы можете просто распечатать их в a console.log и посмотреть, что там.

3. Извините за это.