如何将 Markdown 文件加载到 React 组件中?

IT技术 reactjs markdown
2021-04-21 06:06:11

我如何将 .md 降价文件加载到react组件中?我通过谷歌搜索尝试了很多 npm 库,但找不到好的解决方案。

代码图片

我想加载 .md 文件,例如:

render() {
    <div>
        <MarkDown src="about.md" />
    </div>
}
6个回答

我使用标记GitHub)。

我首先像这样导入它:

import marked from "marked";

然后我在 React 的componentDidMount事件中获取我的 *.md 文件并使用marked(text)text响应在哪里将其存储在我的组件状态中

componentDidMount() {
  const readmePath = require("./Readme.md");

  fetch(readmePath)
    .then(response => {
      return response.text()
    })
    .then(text => {
      this.setState({
        markdown: marked(text)
      })
    })
}

...最后我使用dangerouslySetInnerHTML属性在页面上呈现它

render() {
  const { markdown } = this.state;

  return (
    <section>
      <article dangerouslySetInnerHTML={{__html: markdown}}></article>
    </section>
  )
}
查看stackoverflow.com/a/53975297/7784399而不是这个。它不使用该dangerouslySetInnerHTML属性。
2021-05-27 06:06:11
对我不起作用 ./src/pages/about.md module解析失败:/Users/me/myproject/src/pages/about.md 意外字符 '#' (1:0)处理这种文件类型。语法错误:意外的字符“#”(1:0)
2021-06-04 06:06:11
尝试导入“标记”并且typescript找不到声明文件
2021-06-07 06:06:11
啊,发现我需要安装一个类型定义才能让 Typescript 满意。npmjs.com/package/@types/marked谢谢,我的朋友
2021-06-14 06:06:11
我不熟悉 TypeScript,但您需要先安装该软件包。npm install marked --save应该做的伎俩。
2021-06-17 06:06:11

一个完整的工作示例react-markdown

import React, { Component } from 'react'
import ReactMarkdown from 'react-markdown'
import termsFrPath from './Terms.fr.md'

class Terms extends Component {
  constructor(props) {
    super(props)

    this.state = { terms: null }
  }

  componentWillMount() {
    fetch(termsFrPath).then((response) => response.text()).then((text) => {
      this.setState({ terms: text })
    })
  }

  render() {
    return (
      <div className="content">
        <ReactMarkdown source={this.state.terms} />
      </div>
    )
  }
}

export default Terms
坚硬的。感谢您提供详细信息。你如何处理它把你带到的重定向?
2021-05-25 06:06:11
我得到Cannot find module './Terms.fr.md' or its corresponding type declarations错误。使用const termsFrPath = require './Terms.fr.md'作品。
2021-06-15 06:06:11

您应该使用react-markdown而不是接受的答案,此解决方案不使用dangerouslySetInnerHTML.

应用程序.js

import React, { Component } from 'react';
import AppMarkdown from './App.md';
import ReactMarkdown from 'react-markdown';

class App extends Component {

  constructor() {
    super();
    this.state = { markdown: '' };
  }

  componentWillMount() {
    // Get the contents from the Markdown file and put them in the React state, so we can reference it in render() below.
    fetch(AppMarkdown).then(res => res.text()).then(text => this.setState({ markdown: text }));
  }

  render() {
    const { markdown } = this.state;
    return <ReactMarkdown source={markdown} />;
  }
}

export default App;

应用程序.md

# React & Markdown App
* Benefits of using React... but...
* Write layout in Markdown!
@ToniLeigh 你能提供步骤吗
2021-05-24 06:06:11
这也行不通—— Module parse failed: Unexpected token (1:4)
2021-06-06 06:06:11
我认为你需要添加你必须在其他地方拥有的东西,允许将 MD 文件作为导入处理,就像 JS 文件一样
2021-06-06 06:06:11
当您不在 raw-loader 中将“.md”扩展名列入白名单时会出现问题,(是的 npm 包 raw-loader)...将其放入 webpack 解决了我的情况。
2021-06-15 06:06:11
@Coderboi 装载机?你是什​​么意思?包管理器?净资产管理。
2021-06-17 06:06:11

markdown-to-jsx提供了非常有效的功能来与 React 组件中的 Markdown 交互。

它允许使用您的自定义组件替换/覆盖任何 HTML 元素以进行降价,这里是 doc

import React, { Component } from 'react'
import Markdown from 'markdown-to-jsx';
import README from './README.md'

class PageComponent extends Component {
  constructor(props) {
    super(props)

    this.state = { md: "" }
  }

  componentWillMount() {
    fetch(README)
      .then((res) => res.text())
      .then((md) => {
        this.setState({ md })
      })
  }

  render() {

    let { md } = this.state

    return (
      <div className="post">
        <Markdown children={md}/>
      </div>
    )
  }
}

export default PageComponent

21 年 8 月 2 日编辑

功能组件
const PageComponent = ()=> {

    let [ content, setContent] = useState({md: ""});

    useEffect(()=> {
        fetch(README)
            .then((res) => res.text())
            .then((md) => {
                setContent({ md })
            })
    }, [])

    return (
      <div className="post">
        <Markdown children={content.md}/>
      </div>
    )
}
是否需要像github.com/peerigon/markdown-loader/blob/master/example /...这样的自定义加载器
2021-06-03 06:06:11
收到此错误的人,只需在 webpack 中的 raw-loader module中添加 .md 扩展名
2021-06-03 06:06:11
我在没有加载程序的 create-react-app 中使用了它。
2021-06-06 06:06:11
我想你需要一个文件加载器,你也可以试试 md-loader 。
2021-06-11 06:06:11
这会产生:找不到module:无法解析“./README.md”
2021-06-17 06:06:11

与@Xing-Han-Lu 的回答类似,但具有react Markdown。该概念用于useEffect加载文件,然后使用useState钩子将其添加到状态reactMarkdown

import React, { useState, useEffect } from "react";
import ReactMarkdown from "react-markdown";
import file from "./md/posts.md";

export default function () {
  const [markdown, setMarkdown] = useState("");

  useEffect(() => {
    fetch(file)
      .then((res) => res.text())
      .then((text) => setMarkdown(text));
  }, []);

  return (
    <>
      <ReactMarkdown source={markdown} />
    </>
  );
}