Как получить справочные поля во встроенных блоках с помощью полей форматированного текста Gatsby и Contentful

У меня есть поле редактора форматированного текста, которое принимает встроенный блок, в котором тип контента содержит ссылку на другой тип контента.

Нравится:

content (rich text field)
  - group (embedded block)
    - group-items (reference field)
      - item 1 (referenced content)
      - item 2 (referenced content)

Как я могу получить referenced content предметы, используя @contentful/rich-text-react-renderer?

В настоящее время у меня есть это:

import { MARKS, BLOCKS } from '@contentful/rich-text-types';
import { documentToReactComponents } from '@contentful/rich-text-react-renderer';

const options = {
  renderNode: {
    [BLOCKS.EMBEDDED_ENTRY]: (node) => {
      console.log(node);
      return true;
    }
  },
  renderText: text => text.replace('!', '?'),
};

Это дает мне кучу идентификаторов, но не данных поля для записей, которые мне действительно нужны.

content: []
data:
target: {sys: {…}}
__proto__: Object
nodeType: "embedded-entry-block"

content: []
data:
target:
sys: {id: "c13cBu2W6nOkQMx6bsvqCE5", type: "Link", linkType: "Entry"}
__proto__: Object
__proto__: Object
nodeType: "embedded-entry-block"
__proto__: Object

person Daimz    schedule 01.05.2019    source источник


Ответы (1)


Там, где я столкнулся с двумя проблемами.

Во-первых, кеш-память Гэтсби вызовет проблемы с получением новых данных из contentful, и поэтому вы можете получить только sys, но не fields. Что и происходило со мной.

Просто удалите .cache и перезапустите yarn run dev, и все должно быть хорошо.

Во-вторых, чтобы получить несколько типов содержимого с блоками ввода, этого можно добиться, ища блоки ввода sys.id. Таким образом, вы можете создавать разные компоненты для обработки различных типов контента.

[BLOCKS.EMBEDDED_ENTRY]: (node) => {
      const fields = node.data.target.fields;

      switch (node.data.target.sys.contentType.sys.id) {
        case 'group-item':
          return <div>
            <GroupItem name={fields.name['en-US']} />
          </div>
        default:
           return <div>Fallback Element</div>
}
person Daimz    schedule 06.05.2019