内容丰富的文本未呈现

Posted

技术标签:

【中文标题】内容丰富的文本未呈现【英文标题】:contentful rich text not rendering 【发布时间】:2021-11-14 03:20:17 【问题描述】:

我正在尝试注销原始文件,但到目前为止我无法在控制台中获取任何内容。它只是显示为一个空数组。我的查询一定有问题,因为我在文档上只能找到如何呈现 ContentfulAsset 而不是我可以用 CSS 格式化的实际文本

/* eslint-disable */
import React from 'react';
import  Helmet  from 'react-helmet';
import  graphql  from 'gatsby';
import Layout from '../components/layout';
import  documentToReactComponents  from '@contentful/rich-text-react-renderer';

export const query = graphql`
    query MyQuery($slug: String) 
        contentfulLongPost(Slug:  eq: $slug ) 
            title
            updatedAt(formatString: "MMMM Do, YYYY")
            body 
                raw
                references 
                    ... on ContentfulAsset 
                        contentful_id
                        __typename
                    
                
            
            free
            contentType
        
    
`;

const caseStudy = (props) => 
    console.log(props);

    

    return (
        <Layout>
        
        </Layout>
    );
;

export default caseStudy;

我在 __typename 后面放什么来获取原始数据?

查询 MyQuery($slug: String) contentfulLongPost(Slug: eq: $slug) 标题 updatedAt(formatString: "MMMM Do, YYYY") 身体 生的

`;

【问题讨论】:

__typenameContentfulAsset 内,但您说在呈现富文本时遇到问题,这是一个 raw 字段。你能澄清一下吗?另外,能否说明一下如何获取组件中的数据? 嗨,对不起,我的意思是生的。基本上,你能告诉我如何在屏幕上呈现我的原始身体,即富文本吗? 如果您甚至没有获取它(空数组),您将无法显示它,因此您的查询可能存在问题。这就是为什么我要求您提供如何在组件/页面中打印该数据,以便进行更多调试 我编辑了这个问题,我只是退出道具看看那里有什么。我认为使用 ContentfulAsset 是错误的,但我不确定还能使用什么? 【参考方案1】:

那里有一些问题...caseStudy 必须是 CaseStudy,因为它是一个 React 组件,否则,它将被解释为一个 html 元素,这显然会破坏您的代码(&lt;caseStudy&gt; 不会存在……但)。

即使ContentfulAsset 片段是错误的,如果你的查询是正确的,你应该在raw 字段(位于props.data.contentfulLongPost.raw)中得到一些东西,所以再次检查它。如果您只是想打印富文本,而您的查询不会中断,您可以打印 raw 内部的内容,而 ContentfulAsset 片段中没有数据。

如果$slug 变量持有的过滤器可能有什么问题,因此即使查询正确,您也无法获取数据,因为没有任何数据要获取。

一旦您确保您的数据被正确提取(您在 props.data 中有数据),您可以通过将数据提升到以下位置来自定义输出:

import  BLOCKS, MARKS  from "@contentful/rich-text-types"
import  renderRichText  from "gatsby-source-contentful/rich-text"
​
const Bold = ( children ) => <span className="bold">children</span>
const Text = ( children ) => <p className="align-center">children</p>
​
const options = 
  renderMark: 
    [MARKS.BOLD]: text => <Bold>text</Bold>,
  ,
  renderNode: 
    [BLOCKS.PARAGRAPH]: (node, children) => <Text>children</Text>,
    [BLOCKS.EMBEDDED_ASSET]: node => 
      return (
        <>
          <h2>Embedded Asset</h2>
          <pre>
            <code>JSON.stringify(node, null, 2)</code>
          </pre>
        </>
      )
    ,
  ,

​
renderRichText(node.bodyRichText, options)

来源:https://www.contentful.com/developers/docs/tutorials/general/rich-text-and-gatsby/

可以在https://github.com/contentful/rich-text/tree/master/packages/rich-text-react-renderer查看(几乎是复制/粘贴)完整的可定制示例

这个想法是创建一个自定义对象,该对象将使用自定义 HTML/React 组件解析您获取的数据:

import  BLOCKS, MARKS  from "@contentful/rich-text-types"
import  renderRichText  from "gatsby-source-contentful/rich-text"

const Bold = ( children ) => <span className="bold">children</span>
const Text = ( children ) => <p className="align-center">children</p>

const options = 
  renderMark: 
    [MARKS.BOLD]: text => <Bold>text</Bold>,
  ,
  renderNode: 
    [BLOCKS.PARAGRAPH]: (node, children) => <Text>children</Text>,
    [BLOCKS.EMBEDDED_ASSET]: node => 
      return (
        <>
          <h2>Embedded Asset</h2>
          <pre>
            <code>JSON.stringify(node, null, 2)</code>
          </pre>
        </>
      )
    ,
  ,


function BlogPostTemplate( data ) 

  return <div>data.contentfulBlogPost && renderRichText(data.contentfulBlogPost, options)</div>

其中BlogPostTemplate 代表您的CaseStudycontentfulBlogPost 代表您的contentfulLongPost

总结:

修复组件命名 检查里面有什么props.data.contentfulLongPost.raw 使用提供的slug 检查您是否有任何数据。您可以强制 localhost:8000/___graphql 中 slug 的值来检查哪些数据正在获取您的查询。 使用options 对象和renderRichText 助手自定义输出

【讨论】:

嗨,当我注销 props.data.contentfulLongPost.body.raw 但在一个对象中时,我正在获取数据,但我仍然不知道在查询中输入什么? 如果您收到raw您的查询没问题。要显示它,请按照答案和提供的文档 但文档说我需要使用参考?在什么时候我使用它,我编辑了我的问题以反映我的查询现在的样子。我觉得我现在越来越近了.. 您的问题字面意思是:“内容丰富的富文本未呈现”文档将代码基于特定的数据结构。如果您没有参考资料,请不要使用它们。不要指望复制/粘贴。在文档中references 代表ContentfulAsset,它代表添加的所有资产,而不是内容仪表板中的纯资产(图像等)。您必须根据您的字段和名称调整您的查询,所有这些都可以在localhost:8000/___graphql 轻松访问,只需单击字段,您就会看到里面的内容,您就可以创建查询,只需复制/粘贴它跨度> 所以我现在的查询应该有效吗?如果我正确显示它?

以上是关于内容丰富的文本未呈现的主要内容,如果未能解决你的问题,请参考以下文章

营销标签未在 Magnolia 页面中呈现内容

Haml 链接未呈现为链接

js.erb 文件未呈现其内容

使用 Direct2D GdiInteropRenderTarget 未正确呈现 GDI 内容

iframe 内容未在 iOs5 iPad/iPhone 的滚动下呈现

子页面扩展 base.html.twig 但未呈现 base.html.twig 的内容