【问题标题】:How to output Contentful text as HTML instead of a string in Gatsby?如何在 Gatsby 中将内容文本输出为 HTML 而不是字符串?
【发布时间】:2021-05-01 21:42:00
【问题描述】:

我无法让 Contenful 中的长文本字段在 Gatsby 中正确输出。

我试过了:

const ProjectPost = ({ data }) => {
  const { title, body } = data.contentfulProject
  return (
    <Layout>
      <SEO title={title} />
      <div className="blogpost">
        <h1>{title}</h1>
        <div>{body.body}</div>
      </div>
    </Layout>
  )
}

export default ProjectPost

export const pageQuery = graphql`
  query($slug: String!) {
    contentfulProject(slug: { eq: $slug }) {
      title
      slug
      body {
        body
      }
    }
  }
`

{body.body} 输出的内容没有任何标记。这只是用引号括起来的几段。

如果我这样做:

import React from "react"
import { graphql } from "gatsby"
import Layout from "../components/layout"
import SEO from "../components/seo"

const ProjectPost = ({ data }) => {
  const { title, body } = data.contentfulProject
  return (
    <Layout>
      <SEO title={title} />
      <div className="blogpost">
        <h1>{title}</h1>
        <div>{body.childMarkdownRemark.html}</div>
      </div>
    </Layout>
  )
}

export default ProjectPost

export const pageQuery = graphql`
  query($slug: String!) {
    contentfulProject(slug: { eq: $slug }) {
      title
      slug
      body {
        childMarkdownRemark {
          html
        }
      }
    }
  }
`

它输出用引号括起来的 HTML,但在浏览器中不会被解析为 HTML。我做错了什么?

【问题讨论】:

    标签: reactjs gatsby contentful


    【解决方案1】:

    将 HTML 直接从 CMS 插入 React 组件存在一定的安全问题,但如果您对自己的设置足够安全感到满意,您可以使用特殊的 dangerouslySetInnerHTML React 属性,该属性接受 HTML 字符串并将其转换进入实际标记。

    明智地使用它并花点时间阅读此处的一些安全问题,但将 &lt;div&gt; 替换为以下内容应该会显示来自 CMS 的实际 HTML。

    <div dangerouslySetInnerHTML={{ __html: body.childMarkdownRemark.html }}></div>
    

    【讨论】:

    • 谢谢!从昨晚开始,我一直在研究这个问题并遇到了:@contentful/rich-text-react-renderer。我已经安装了它,并且可以使用 '
      {documentToReactComponents(project.description.json)}
      ' 成功输出富文本 - 我假设如果它是 Contentful 的官方方式,它应该是安全的?
    • 啊,如果 Contentful 有自己更优雅的处理方式,那么是的,我建议使用它。这是我在其他 HTML 源代码中使用过几次的通用解决方案!
    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多