You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用gatsby-source-contentful在Gatsby与Contentful中渲染富文本异常问题

问题原因
  • contentful返回的bodyRichText.raw是序列化的JSON字符串,不是可遍历的节点数组:你对字符串调用数组专属的map方法,字符串原型本身不存在该方法,要么逻辑直接静默不执行,要么因为空值等原因没有抛出错误,自然没有内容输出。
  • documentToReactComponents方法接收的是完整的富文本结构对象,不需要你手动遍历节点,它内部已经实现了节点递归解析渲染的逻辑,强行遍历反而会破坏正常的渲染流程。
修复方案
  1. 先确认你已经正确安装并导入依赖:
npm install @contentful/rich-text-react-renderer
import { documentToReactComponents } from '@contentful/rich-text-react-renderer';
  1. 修改组件代码,无需遍历,直接将raw转换为JSON对象后传入方法即可:
function ArticleBody({raw}) {
  // 空值判断避免异常报错
  if (!raw) return null;

  // 将raw字符串转换为可识别的富文本对象,如果你使用的插件版本已经自动完成parse操作,可以直接传入raw
  const richTextObj = typeof raw === 'string' ? JSON.parse(raw) : raw;

  return (
    <>
      {documentToReactComponents(richTextObj)}
    </>
  );
}

export default ArticleBody;

如果需要自定义富文本内各元素的渲染样式,比如修改代码块、链接、图片的展示逻辑,可以传入第二个配置参数:

import { BLOCKS, INLINES } from '@contentful/rich-text-types';

const renderOptions = {
  renderNode: {
    [BLOCKS.HEADING_1]: (node, children) => <h1 className="post-title">{children}</h1>,
    [INLINES.HYPERLINK]: (node, children) => <a href={node.data.uri} target="_blank" rel="noopener noreferrer">{children}</a>
  }
}

// 调用时传入配置即可
documentToReactComponents(richTextObj, renderOptions)

内容的提问来源于stack exchange,提问作者silencedogood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:06:03