嵌套的 MDX 组件

Nested MDX component

我有一个在 mdx 文件中使用的组件 问题是组件中的内容呈现为文本,但我想将它们呈现为 mdx。 这是 mdx 文件的样子:

---
title: Topic 1
---
<Notice> Notice **Two** with link [link](https://angular.io/) </Notice>

outside look: Notice **Two** with link [link](https://angular.io/)

这是 Notice 组件

import React from "react";

const Notice = ({ children, type }: { children: any; type?: string }) => {
  return (
    <div style={{ border: "2px solid dodgerblue" }}>
      <p>{type}</p>
      <div>{children}</div>
    </div>
  );
};

export default Notice;

还有根文件的代码:


import * as React from "react";
import { MDXRenderer } from "gatsby-plugin-mdx";
import { MDXProvider } from "@mdx-js/react"

import Notice from './notice/notice';


export default function ({ docName, title, body, slug }) {
  const shortcodes = {Notice};
  return (
    <div style={gridWrapper}>
      <article>
        <h1>{title}</h1>
        <div>
          <MDXProvider components={shortcodes}>
              <MDXRenderer>{body}</MDXRenderer>
          </MDXProvider>
        </div>
      </article>
    </div>
  );
}


知道如何解决这个问题吗?

</Notice> this part in the mdx file should be rendered as a link and a bold text right?

除非您添加 MDX 渲染器或降价解析器(如 markdown-to-jsx)以将降价语法解析为 HTML。

,否则不会。

最后,您在 Notice 中包装的是使用 Notice 的组件 JSX 结构呈现的纯文本,其中 children 呈现为-是 ({children}).

也就是说,您可以尝试在 Notice 组件中使用 MDXRenderer,例如:

import React from "react";
import { MDXRenderer } from "gatsby-plugin-mdx"

const Notice = ({ children, type }: { children: any; type?: string }) => {
  return (
    <div style={{ border: "2px solid dodgerblue" }}>
      <p>{type}</p>
      <MDXRenderer>{children}</MDXRenderer>
    </div>
  );
};

export default Notice;

我不确定代码嵌套 MDXRenderer 的行为方式,这就是为什么我建议 markdown-to-jsx 解决方案,这将导致非常相似的情况,例如:

import React from "react";
import Markdown from 'markdown-to-jsx';

const Notice = ({ children, type }: { children: any; type?: string }) => {
  return (
    <div style={{ border: "2px solid dodgerblue" }}>
      <p>{type}</p>
      <Markdown>{children}</Markdown>
    </div>
  );
};

export default Notice;