如何使用Gatsby和Contentful的RTF文本字段获取嵌入式块的参考字段

时间:2019-05-01 14:47:40

标签: reactjs gatsby contentful

我有一个RTF编辑器字段,该字段接受一个嵌入式块,其中内容类型包含指向另一种内容类型的引用链接。

赞:

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('!', '?'),
};

哪一个给了我很多ID,但没有我真正想要的条目的字段数据。

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

1 个答案:

答案 0 :(得分:0)

这里我遇到了两个问题。

首先,有时候盖茨比的缓存会导致从内容中检索新数据时出现问题,因此,您可能只会获得sys而不是fields。这是我发生的事情。

只需删除.cache并重新运行yarn run dev,就可以了。

第二,要获得带有enter块的多个contentType,可以通过查找Entry块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>
}