【问题标题】:Contentful: documentToHtmlString doesn't include embedded image in rich text内容丰富:documentToHtmlString 不包含富文本中的嵌入图像
【发布时间】:2019-06-02 15:10:33
【问题描述】:

我有以下富文本文档

{  
   "data":{},
   "content":[  
      {  
         "data":{},
         "content":[  
            {  
               "data":{},
               "marks":[ ],
               "value":"test",
               "nodeType":"text"
            }, {  
               "data":{},
               "marks":[],
               "value":"",
               "nodeType":"text"
            }
         ],
         "nodeType":"paragraph"
      },
      {  
         "data":{  
            "target":{  
               "sys":{  
                  "space":{  
                     "sys":{  
                        "type":"Link",
                        "linkType":"Space",
                        "id":"gedg1u5b0yz9"
                     }
                  },
                  "id":"2CzKe2pWvewCiek6w0yyoQ",
                  "type":"Asset",
                  "createdAt":"2019-01-07T22:37:55.473Z",
                  "updatedAt":"2019-01-07T22:37:55.473Z",
                  "environment":{  
                     "sys":{  
                        "id":"master",
                        "type":"Link",
                        "linkType":"Environment"
                     }
                  },
                  "revision":1,
                  "locale":"en-US"
               },
               "fields":{  
                  "title":"Test Image",
                  "description":"Image for testing",
                  "file":{  
                     "url":"//images.ctfassets.net/<hidden>/<hidden>/<hidden>/IMG_2878.JPG",
                     "details":{  
                        "size":3874595,
                        "image":{  
                           "width":5184,
                           "height":3456
                        }
                     },
                     "fileName":"IMG_2878.JPG",
                     "contentType":"image/jpeg"
                  }
               }
            }
         },
         "content":[],
         "nodeType":"embedded-asset-block"
      },
      {  
         "data":{},
         "content":[  
            {  
               "data":{},
               "marks":[],
               "value":"",
               "nodeType":"text"
            }
         ],
         "nodeType":"paragraph"
      }
   ],
   "nodeType":"document"
}

当我使用 documentToHtmlString 时(从这里https://www.npmjs.com/package/@contentful/rich-text-html-renderer

documentToHtmlString(document);

输出如下

<p>test</p><p></p>

有人知道如何让它也输出img标签吗?

【问题讨论】:

    标签: javascript contentful


    【解决方案1】:

    来自https://github.com/contentful/rich-text/issues/58#issuecomment-452236848

    您需要指定如何呈现 你可以在这里找到更多关于它的信息https://github.com/contentful/rich-text/tree/master/packages/rich-text-html-renderer#usage

    import { BLOCKS } from '@contentful/rich-text-types';
    import { documentToHtmlString } from '@contentful/rich-text-html-renderer';
    
    const options = {
      renderNode: {
        [BLOCKS.EMBEDDED_ENTRY]: (node) => `<custom-component>${customComponentRenderer(node)}</custom-component>`
      }
    }
    
    documentToHtmlString(document, options);
    

    我的具体决议是:

    const options = {
        renderNode: {
            [BLOCKS.EMBEDDED_ASSET]: ({ data: { target: { fields }}}) =>
                `<img src="${fields.file.url}" height="${fields.file.details.image.height}" width="${fields.file.details.image.width}" alt="${fields.description}"/>`,
        },
    };
    

    【讨论】:

      【解决方案2】:

      这是原始答案和硬编码的动态值, 我希望它可以帮助读者对具体问题有一个直接的答案:

      let options = {
        renderNode: {
          'embedded-asset-block': (node) =>
            `<img class="img-fluid" src="${node.data.target.fields.file.url}"/>`
        }
      }
      let bodyHTML = body ? documentToHtmlString(body, options) : ''
      

      【讨论】:

      • 为什么这是“最好的方法”?您采用了原始答案并硬编码动态值。
      • @SethMcClaine 你的回答非常适合好好学习。
      【解决方案3】:
      const options = {
          renderNode: {
              [BLOCKS.EMBEDDED_ASSET]: ({ data: { target: { fields }}}) =>
              <div dangerouslySetInnerHTML={{__html: `<img src="${fields.file['en-GB'].url}" alt="${fields.title['en-GB']}"/>`}} />,
          },
      };
      

      我发现我需要设置dangerouslySetInnerHTML 才能在浏览器中正确呈现。

      【讨论】:

      猜你喜欢
      • 2021-04-25
      • 2021-12-06
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      相关资源
      最近更新 更多