web-dev-qa-db-ja.com

ReactコンポーネントからMarkdownをレンダリングするにはどうすればよいですか?

ドキュメントをマークダウンで作成し、JSX(ES6 + CommonJS)コードからこれらのファイルをReactコンポーネントにレンダリングします。これを実現するにはどうすればよいですか?

たとえば、styles.markdownがあり、<p>タグにレンダリングしたいと思います。

33
thevangelist

Markdownパーサーへの呼び出しをラップする単純なReactコンポーネントを作成するだけです。JavaScriptには2つの非常に優れたものがあります。

これで、次のようなコンポーネントを作成できます。

var MarkdownViewer = React.createClass({
    render: function() {
        // pseudo code here, depends on the parser
        var markdown = markdown.parse(this.props.markdown);
        return <div dangerouslySetInnerHTML={{__html:markdown}} />;
    }
});

以前は既に存在していましたが、もうメンテナンスされていないようです: https://github.com/tcoopman/markdown-react

また、React Markdown Editorが必要な場合は、 react-mde を確認してください。免責事項:私は著者です。

48
André Pena

その包み - react-markdown with Markdownコンポーネントが適切な選択です:

import React from 'react'
import Markdown from 'react-markdown'

var src = "# Load the markdown document"

React.render(
    <Markdown source={src} />,
    document.getElementById('root')
);
14
oklas

マークダウンテキストからhtmlをレンダリングするMarkdownコンポーネントの例、データをロードするロジックは、別個のストア/親コンポーネント/その他に実装する必要があります。マークダウンをHTMLに変換するために マーク付き パッケージを使用しています。

import React from 'react';
import marked from 'marked';

export default class MarkdownElement extends React.Component {
  constructor(props) {
    super(props);

    marked.setOptions({
      gfm: true,
      tables: true,
      breaks: false,
      pedantic: false,
      sanitize: true,
      smartLists: true,
      smartypants: false
    });
  }
  render() {
    const { text } = this.props,
      html = marked(text || '');

    return (<div>
      <div dangerouslySetInnerHTML={{__html: html}} />
    </div>);
  }
}

MarkdownElement.propTypes = {
  text: React.PropTypes.string.isRequired
};

MarkdownElement.defaultProps = {
  text: ''
};
9
Yevgen Safronov

私はパーティーに少し遅れましたが、dangerouslySetInnerHtmlハックを必要としないという追加の利点がある上記のライブラリに競合ライブラリを作成しました: https://github.com/おそらくup/markdown-to-jsx

6
probablyup

次のようなものを試してください:

import fs from 'fs';
import React, { Component, PropTypes } from 'react';

class Markdown extends Component {
    constructor() {
        super(props);
        this.state = { contents: '' };
        this.componentDidMount = this.componentDidMount.bind(this);
    }

    componentDidMount() {
        const contents = fs.readFileSync(this.props.path, 'utf8');
        this.setState({ contents });
    }

    render()
        return (
            <div>
                {this.state.contents.split('\n').map((line, i) =>
                    line ? <p key={i}>{line}</p> : <br key={i} />)}
            </div>
        );
    }
}

Markdown.propTypes = { path: PropTypes.string.isRequired };

React.render(<Markdown path='./README.md' />, document.body);

または、ES7 +機能を使用している場合:

import fs from 'fs';
import React, { Component, PropTypes } from 'react';

class Markdown extends Component {
    static propTypes = { path: PropTypes.string.isRequired };

    state = { contents: '' };

    componentDidMount = () => {
        const contents = fs.readFileSync(this.props.path, 'utf8');
        this.setState({ contents });
    };

    render() {
        return (
            <div>
                {this.state.contents.split('\n').map((line, i) =>
                    line ? <p key={i}>{line}</p> : <br key={i} />)}
            </div>
        );
    }
}

React.render(<Markdown path='./README.md' />, document.body);

クライアント側で実行している場合にfs.readFileSyncを使用するには、 brfs 変換を使用する必要があります。

5
kpimov