如何在 Gatsby 中将 markdown frontmatter 显示为 HTML

Posted

技术标签:

【中文标题】如何在 Gatsby 中将 markdown frontmatter 显示为 HTML【英文标题】:How to display markdown frontmatter as HTML in Gatsby 【发布时间】:2021-05-13 02:42:31 【问题描述】:

我的索引页面显示带有图像和文本的简介。 但我无法将文本格式化为 html。我在 Netlify CMS 中使用 markdown-widget,并希望在管理视图中分隔内容时换行。 我也尝试过使用dangerouslySetInnerHTML=item.text,但没有任何运气。

item 只是所有简介的映射。

<p> item.text </p>

graphql:

markdownRemark(frontmatter:  templateKey:  eq: "index-page"  ) 
      frontmatter 
        intro 
          blurbs 
            image 
              childImageSharp 
                fluid(maxWidth: 2048, quality: 100) 
                  ...GatsbyImageSharpFluid
                
              
            
            heading
            text
          
          heading
          description
        
      
    
  

config.yml 中的标签:

- label: "Intro", name: "intro", widget: "object", fields: [label: "Heading", name: "heading", widget: "string", label: "Description", name: "description", widget: text, label: Blurbs, name: blurbs, widget: "list", fields: [label: "Image", name: "image", widget: "image", label: "Rubrik", name: "heading", widget: "string", label: "Text", name: "text", widget: "markdown"]]

我想从中读取的 Index.md(我想这是可行的,因为我得到了要显示的数据,而不是 html 形式)

  blurbs:
    - image: /img/img1.jpg
      heading: heading one
      text: >-
        This is the content i want in HTML
    
    - image: /img/img2.jpg
      heading: heading two
      text: >-
        This is also the content i want in HTML
       
        And this should give me a linebreak

【问题讨论】:

【参考方案1】:

您可以使用gatsby-transformer-remark-frontmatter 插件来实现这一点。

安装插件并将其添加到您的 gatsby-config.js:

$ npm install gatsby-transformer-remark-frontmatter
// in your gatsby-config.js
plugins: [
  'gatsby-transformer-remark',
  'gatsby-transformer-remark-frontmatter'
]

要告诉 Gatsby 每个简介中的文本字段包含 markdown,并且您希望将字符串转换为 html,您需要在架构中添加一个 @md 指令。为此,请将以下代码添加到 gatsby-node.js 文件中。

// in your gatsby-node.js

exports.createSchemaCustomization = ( actions ) => 
  const createTypes = actions
  const typeDefs = `
    type MarkdownRemark implements Node 
      frontmatter: Frontmatter
    

    type Frontmatter 
      intro: Intro
    

    type Intro 
      blurbs: [Blurb]
    

    type Blurb 
      text: String @md
    
  `
  createTypes(typeDefs)

现在,简介的 text 字段将有一个特殊的 html 字段,您可以将其包含在查询中:

markdownRemark(frontmatter:  templateKey:  eq: "index-page"  ) 
      frontmatter 
        intro 
          blurbs 
            text 
              html
            
          
        
      
    
  

最后,在您的组件中,您应该能够像这样遍历简介并呈现 html:

...
<div dangerouslySetInnerHTML= __html: blurb.text.html  />

【讨论】:

【参考方案2】:

假设一切都已正确设置,看起来如此。

默认情况下,frontmatter 内部有一个 html 属性:

markdownRemark(frontmatter:  templateKey:  eq: "index-page"  ) 
      frontmatter 
        html
        intro 
          blurbs 
            image 
              childImageSharp 
                fluid(maxWidth: 2048, quality: 100) 
                  ...GatsbyImageSharpFluid
                
              
            
            heading
            text
          
        
      
    
  

注意:在localhost:8000/___graphql测试您的查询

一旦你查询了它,就照你做的那样显示它,嵌套到正确的属性:

dangerouslySetInnerHTML=html

您可以在https://www.gatsbyjs.com/docs/how-to/sourcing-data/sourcing-from-netlify-cms/查看完整教程

【讨论】:

问题是我在 md 文件的 HTML 部分中没有文本数据。据我了解,HTML 是结尾 === 之后的代码。我希望它在文本 frontmatter key/value 中,但呈现为 html。如果这有意义? 在这种情况下,frontmatter 内必须有一个项目,如果你的对象。如果您查询它(在localhost:8000/___graphql 中),它应该显示 HTML。该字段可以使用dangerouslySetInnerHTML 显示 “blurbs”是一个对象数组,但我在那个嵌套级别中找不到 html。只能查询图片、标题和文字? 该字段是否在widget中设置为markdown? 是的!由于它位于列表小部件中,会不会是一些问题?

以上是关于如何在 Gatsby 中将 markdown frontmatter 显示为 HTML的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gatsby 中将多个 yaml 文件映射到 frontmatter

如何使用 gatsby-transformer-remark 在 markdown 中获取自定义备注?

Gatsby 如何使用 GraphQL 提供 Markdown frontmatter?

如何更改 Markdown 链接相对路径作为 gatsby-transformer-remark 的预处理

如何使用 Gatsby 显示图片和 markdown 文件的文件夹

来自 markdown 帖子的 Gatsby 图像未从 graphql 查询中显示