【问题标题】:Gatsby doesn't render MD in component inside of mdx fileGatsby 不在 mdx 文件内的组件中渲染 MD
【发布时间】:2020-12-31 02:47:07
【问题描述】:

什么是有效的:

  • 布局已正确应用于我的每个页面
  • MDX 文件正确获取 Hero 和 section 组件并正确渲染容器的 HTML/CSS
  • 加载并显示来自 MDX 的数据

什么不起作用:

  • Hero 或 Section Shortcode 中的 MD 未呈现! # 不会转化为 H1 等。

我尝试过的:

  • 在 Section & Hero 中使用 MDXRender => 错误
  • 直接在 MDX 文件中使用组件而不是短代码

问题:

  • 是否无法在短代码中正确呈现 MD? 换句话说,MDX 不是递归渲染的吗?

内容/index.mdx:

---
title: Main Content English
slug: /main-content/
---

<Hero># This is a test, but never gets transformed</Hero>

<Section># In Section Headline</Section>

# ABC

Officia cillum _asdasd_ et duis dolor occaecat velit culpa. Cillum eu sint adipisicing labore incididunt nostrud tempor fugiat. Occaecat ex id fugiat laborum ullamco. Deserunt sint quis aliqua consequat ullamco Lorem dolor pariatur laboris. Laborum officia ut magna exercitation elit velit mollit do. Elit minim nostrud cillum reprehenderit deserunt consequat. Aliqua ex cillum sunt exercitation deserunt sit aliquip aliquip ea proident cillum quis.

我的 layout.js 看起来像这样:

import React, {useEffect} from "react";

import "./Layout.css";

import { MDXProvider } from "@mdx-js/react";
import { MdxLink } from "gatsby-theme-i18n";
...

import Hero from "../Hero/HomepageHero/HomepageHero"
import Section from "../Section/Section"


const components = {
  a: MdxLink,
  Hero, Section
};


export default function Layout({ children }) {
   ...
  return (
    <div className="appGrid">
      <Header />

      <ScrollToTopButton />

      <div className="cell contentCell">
        <MDXProvider components={components}>{children}</MDXProvider>
      </div>

      <Footer />

      <Copyright />
    </div>
  );
}

我的 index.js 页面(自动加载)如下所示:

import * as React from "react";

import { graphql } from "gatsby";

import Layout from "../components/Layout/layout";
import { MDXRenderer } from "gatsby-plugin-mdx";


const IndexPage = ({ data }) => {

  return (
    <Layout>
      {data.allFile.nodes.map(({ childMdx: node }) => (
        <div>
          {node ? (
            <MDXRenderer>{node.body}</MDXRenderer>
          ) : (
            <div>This page has not been translated yet.</div>
          )}
        </div>
      ))}
    </Layout>
  );
};

export default IndexPage;

export const query = graphql`
  query($locale: String!) {
    allFile(
      filter: {
        sourceInstanceName: { eq: "content" }
        childMdx: { fields: { locale: { eq: $locale } } }
      }
    ) {
      nodes {
        childMdx {
          body
        }
      }
    }
  }
`;

盖茨比配置:

module.exports = {
  siteMetadata: {
    siteUrl: "localhost:8000",
    title: "app",
  },
  plugins: [
    {
      resolve: "gatsby-plugin-google-analytics",
      options: {
        trackingId: "",
      },
    },
    "gatsby-plugin-sharp",
    "gatsby-plugin-react-helmet",
    "gatsby-plugin-sitemap",
    "gatsby-plugin-offline",
    {
      resolve: "gatsby-plugin-manifest",
      options: {
        icon: "src/images/icon.png",
      },
    },
    "gatsby-transformer-sharp",
    {
      resolve: "gatsby-source-filesystem",
      options: {
        name: "images",
        path: "./src/images/",
      },
      __key: "images",
    },
    {
      resolve: `gatsby-theme-i18n`,
      options: {
        defaultLang: `en`,
        locales: `en el de`,
        configPath: require.resolve(`${__dirname}/i18n/config.json`),
      },
    },
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `pages`,
        path: `${__dirname}/src/pages/`,
      },
    },
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `content`,
        path: `${__dirname}/src/content/`,
      },
    },
    {
      resolve: `gatsby-plugin-mdx`,
      options: {
        defaultLayouts: {
          default: require.resolve(`./src/components/Layout/layout.js`),
        },
      },
    },
  ],
};

Section.js 组件

import React from "react";
import PropTypes from "prop-types";
import "./Section.css";

export default function Section(props) {
  let content = props.children
  if (props.centered) {
    content = (
      <div className="grid-container ">
        {props.children}
      </div>
    );
  }
  return <div className="section">{content}</div>;
}

Section.propTypes = {
  centered: PropTypes.bool,
  children: PropTypes.element,
};

【问题讨论】:

    标签: javascript reactjs graphql gatsby mdxjs


    【解决方案1】:

    最后是一个简单的间距问题。

    无需任何额外工作即可完美运行:

    ---
    title: Main Content English
    slug: /main-content/
    ---
    
    <Hero>
    
    # This is a test, but never gets transformed
    
    </Hero>
    
    <Section>
    
    # In Section Headline
    
    </Section>
    
    ...
    

    注意空行!

    【讨论】:

    • 这样的解决方案很奇怪,似乎除了markdown ![](url) 方法之外,目前没有其他方法可以在html 中呈现gatsby-image 组件,这是唯一适用的解决方案我。
    【解决方案2】:

    使用 MDX,您在 Markdown (MD + JSX) 文件中呈现 JSX,因此,# 当它被 JSX 包装时,它不会被识别为简码组件在同一声明行中时:

    变化:

    <Hero># This is a test, but never gets transformed</Hero>
    

    收件人:

    <Hero>
        # This is a test, but never gets transformed
    </Hero>
    

    或者,您也可以更改:

    <Hero># This is a test, but never gets transformed</Hero>
    

    收件人:

    <Hero><h1> This is a test, but never gets transformed</h1></Hero>
    

    另一件可能对您有用的事情是使用 Markdown 解析器(如 markdown-to-jsx)和:

    ---
    title: Main Content English
    slug: /main-content/
    ---
    
    import Markdown from 'markdown-to-jsx';
    
    
    <Hero><Markdown># This is a test, but never gets transformed</Markdown></Hero>
    
    <Section><Markdown># In Section Headline</Markdown></Section>
    
    # ABC
    
    Officia cillum _asdasd_ et duis dolor occaecat velit culpa. Cillum eu sint adipisicing labore incididunt nostrud tempor fugiat. Occaecat ex id fugiat laborum ullamco. Deserunt sint quis aliqua consequat ullamco Lorem dolor pariatur laboris. Laborum officia ut magna exercitation elit velit mollit do. Elit minim nostrud cillum reprehenderit deserunt consequat. Aliqua ex cillum sunt exercitation deserunt sit aliquip aliquip ea proident cillum quis.
    

    或者,您可以添加一个自定义映射组件,就像使用 MdxLink 一样,但使用您自己的组件来解析 children,就像 &lt;Markdown&gt; 依赖项一样。

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多