Использование подсветки синтаксиса с tsx react markdown

Я слежу за Github https://github.com/remarkjs/react-markdown и пытаюсь добавить SyntaxHighlighter в свои фрагменты кода уценки. Я получаю указанную ниже ошибку при попытке использовать пример кода внутри функции, которую я использую для рендеринга сообщений. В Markdown используются три обратных кавычки, и здесь используется NextJS.

Если я закомментирую строку {...props} красное подчеркивание удалено, но я не вижу, чтобы код вступил в силу в моих сообщениях

Пытался добавить что-либо, как показано ниже, но все же я не вижу никакого эффекта в уценке.

code({ node, inline, className, children, ...props }: any)

Ошибка:

      No overload matches this call.
  Overload 1 of 2, '(props: SyntaxHighlighterProps | Readonly<SyntaxHighlighterProps>): SyntaxHighlighter', gave the following error.
    Type '{ ref?: LegacyRef<HTMLElement> | undefined; key?: Key | null | undefined; defaultChecked?: boolean | undefined; defaultValue?: string | number | readonly string[] | undefined; ... 255 more ...; PreTag: string; }' is not assignable to type 'IntrinsicClassAttributes<SyntaxHighlighter>'.
      Types of property 'ref' are incompatible.
        Type 'LegacyRef<HTMLElement> | undefined' is not assignable to type 'LegacyRef<SyntaxHighlighter> | undefined'.
          Type '(instance: HTMLElement | null) => void' is not assignable to type 'LegacyRef<SyntaxHighlighter> | undefined'.
            Type '(instance: HTMLElement | null) => void' is not assignable to type 

Код:

      const BlogPost = ({ frontMatter, markdownBody }: BlogPostProps) => {
  if (!frontMatter) return <></>;
  return (
    <Layout>
      <ReactMarkdown
        components={{
          code({ node, inline, className, children, ...props }) {
            const match = /language-(\w+)/.exec(className || "");
            return !inline && match ? (
              <SyntaxHighlighter
                style={vscDarkPlus}
                language={match[1]}
                PreTag="div"
                // {...props}
              >
                {String(children).replace(/\n$/, "")}
              </SyntaxHighlighter>
            ) : (
              <code className={className} {...props}>
                {children}
              </code>
            );
          },
        }}
      >
        {markdownBody}
      </ReactMarkdown>
    </Layout>
  );
};

1 ответ

Я столкнулся с подобной проблемой сегодня. Похоже, что их документы повсюду. Я вижу, что SyntaxHighlighter требует дочерних элементов, но вам не удалось добавить его как часть тега. Ниже приведен мой фрагмент кода с закомментированным реквизитом, как и вы. Этот фрагмент кода является редактированием из commentjs .

            <ReactMarkdown className="preview-markdown" 
      children={input}
      remarkPlugins={[[remarkGfm, {singleTilde: false}]]}
      components={{
        code({node, inline, className, children, ...props}) {
          const match = /language-(\w+)/.exec(className || '')
          return !inline && match ? (
            <SyntaxHighlighter
              children={String(children).replace(/\n$/, '')}
              style={docco}
              language={match[1]}
              PreTag="div"
              // {...props}
            />
          ) : (
            <code className={className} {...props}>
              {children}
            </code>
          )
        }
      }}
       />
Другие вопросы по тегам