Wie rendere ich Markdown aus einer React-Komponente?

Lesezeit: 6 Minuten

Benutzeravatar des Kapuziners
Kapuziner

Ich habe meine Dokumentation in Markdown geschrieben und möchte diese Dateien aus meinem JSX-Code (ES6 + CommonJS) in React-Komponenten rendern. Wie kann ich das erreichen?

Zum Beispiel habe ich styles.markdown und ich möchte es in a rendern <p> Schild.

  • Benutzt du Browserify?

    – kpimow

    7. August 2015 um 11:46 Uhr

  • Ja, ich verwende browserify

    – Kapuziner

    7. August 2015 um 11:53 Uhr

  • Benutzt du auch Babel? Was meinst du mit haben styles.markdown?

    – kpimov

    7. August 2015 um 12:06 Uhr

  • Ja, Babel auch. styles.markdown ist nur ein Beispiel für eine Markdown-Datei

    – Kapuziner

    7. August 2015 um 12:08 Uhr

  • Ich bin mir nicht sicher, was Sie hier zu tun versuchen. Sie möchten etwas haben, das Komponenten auf Markdown reagiert?

    – Mike Fahrer

    7. August 2015 um 12:49 Uhr

Benutzeravatar von Andre Pena
André Pena

Sie können verwenden Reagieren-Markdown:

const React = require('react')
const ReactDOM = require('react-dom')
const ReactMarkdown = require('react-markdown')

const input="# This is a header\n\nAnd this is a paragraph"

ReactDOM.render(<ReactMarkdown source={input} />, document.getElementById('container'))

Oder … Sie können einfach eine einfache React-Komponente erstellen, die einen Aufruf an einen Markdown-Parser umschließt. Es gibt zwei sehr gute für JavaScript:

Jetzt können Sie eine Komponente wie diese erstellen:

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}} />;
    }
});

Früher gab es schon einen, aber es scheint nicht mehr gepflegt zu werden: https://github.com/tcoopman/markdown-react

Wenn Sie einen React Markdown Editor benötigen, schauen Sie sich auch Folgendes an: Reaktionsmodus. Haftungsausschluss: Ich bin der Autor.

  • Ich bin mir nicht sicher, wann sich das geändert hat, aber ich habe es heute durchgearbeitet und React scheint jetzt ein Objekt mit einem __html-Feld zu erfordern, anstatt nur eine Zeichenfolge (z dangerouslySetInnerHTML={{__html: markdown}}). Auch wenn es für die hier gestellte Frage möglicherweise nicht relevant ist, ist es erwähnenswert, dass man gut beraten ist, die Eingabe von der Markdown-Bibliothek bereinigen zu lassen, um XSS zu vermeiden, wenn etwas davon möglicherweise nicht vertrauenswürdig ist (z var markdown = marked.parse(this.props.markdown, {sanitize: true});).

    – Großer Auftakt

    22. Dezember 2015 um 4:28 Uhr


  • Danke @GrandOpener. Ich habe die Antwort entsprechend aktualisiert.

    – André Pena

    6. Juni 2017 um 14:36 ​​Uhr

  • Ist dangerouslySetInnerHTML ineffizient, wenn die Komponente neu rendert?

    – David Callanan

    11. Januar 2019 um 11:19 Uhr

  • Es sieht aus wie source={...} ist obsolet. In der aktuellen Version ist es – <ReactMarkdown children={ ... }/>

    – mukund

    31. Juli 2021 um 14:50 Uhr


Benutzeravatar von oklas
okay

Das Paket react-markdown mit Markdown Komponente wird eine gute Wahl sein:

import React from 'react'
import Markdown from 'react-markdown'
    
var src = "# This is markdown document"
    
React.render(
  <Markdown children={src} />,
  document.getElementById('root')
)

Sie können hier-Dokumente wie folgt schreiben:

<Markdown>
  # Header

  * dotted lists
  * [url](/doc)
</Markdown>

Es ist möglich, Transformer für Link-URLs und Bild-URLs und vieles mehr anzugeben.

  • Ich stimme @Oklas zu. React-Markdown ist wahrscheinlich die beste Lösung. Ich habe gerade angefangen, es selbst zu benutzen. Achten Sie jedoch darauf, wie und welche Anführungszeichen oder Backticks Sie verwenden. Wenn Sie in es6 und höher schreiben, können Codeausschnitte Probleme verursachen. Zum Beispiel musste ich es6 in es5 transpilieren (verwendeter Babel-Transpiler auf ihrer Website für Geschwindigkeit und Präzision), um Fehler zu entfernen, die ich als “undefiniert” erhielt. Beachten Sie nur, dass es hier und da ein paar Herausforderungen in Bezug auf die Syntax gibt, für die Sie Problemumgehungen finden müssen.

    – Maria Campell

    18. Oktober 2017 um 11:04 Uhr

  • Und dies ist der Diskussionsthread, den ich heute früher mit dem Ersteller des Plugins bezüglich des Problems hatte: github.com/rexxars/react-markdown/issues/91 rexxars hat schnell reagiert und war äußerst hilfreich!

    – Maria Campell

    18. Oktober 2017 um 20:17 Uhr


  • Das ist ziemlich gut, aber ich habe aus irgendeinem Grund ein Problem damit, dass HTML-Tags nicht funktionieren, wenn Markdown als Strings übergeben wird, wie es funktionieren soll, weil ich in der Demo gesehen habe, wie sie HTML-Tags verwenden, aber es scheint nicht zu funktionieren Für mich funktioniert das Markdown-Zeug jedoch in Ordnung

    – Gopherin

    21. März 2018 um 19:49 Uhr

  • Eine Sache, auf die ich gestoßen bin: Sie können keine importieren .md Datei in Javascript, es sei denn, Sie haben den richtigen Loader, aber Sie können den Markdown einfach in eine Zeichenfolge einfügen und auf diese Weise importieren.

    – cph2117

    17. Februar 2019 um 15:13 Uhr

Ich bin etwas spät zur Party, aber ich habe eine Konkurrenzbibliothek zu den oben genannten geschrieben, die den zusätzlichen Vorteil hat, dass ich sie nicht benötige dangerouslySetInnerHtml hacken: https://github.com/probablyup/markdown-to-jsx

  • Ich habe beides ausprobiert react-markdown und markdown-to-jsx heute. Um es kurz zu machen: markdown-to-jsx ist 5-mal leichter und es war viel einfacher, es zum Öffnen zu konfigurieren _blank Links mit sicher noopener Voreinstellungen. Sehen github.com/probablyup/markdown-to-jsx/issues/… (Ich hatte im Grunde keinen Erfolg damit react-markdown)

    – Vadoranfrage

    14. Juni 2020 um 15:51 Uhr


Beispiel einer Markdown-Komponente, die HTML aus Markdown-Text rendert, die Logik zum Laden von Daten sollte in einem separaten Store/einer übergeordneten Komponente/was auch immer implementiert werden. ich benutze markiert Paket zum Konvertieren von Markdown in 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: ''
};

Versuchen Sie so etwas:

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);

Oder wenn Sie ES7+-Funktionen verwenden:

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);

Sie müssen die verwenden brfs transformieren, um fs.readFileSync verwenden zu können, wenn dies clientseitig ausgeführt wird.

  • ja. fs ist ein Knotenmodul und funktioniert nicht clientseitig (zumindest soweit ich weiß)

    – archae0pteryx

    4. August 2017 um 4:14 Uhr

  • ja. fs ist ein Knotenmodul und funktioniert nicht clientseitig (zumindest soweit ich weiß)

    – archae0pteryx

    4. August 2017 um 4:14 Uhr

1438300cookie-checkWie rendere ich Markdown aus einer React-Komponente?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy