2015-08-07 6 views
13

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

Zum Beispiel habe ich styles.markdown und ich möchte es in ein <p>-Tag rendern.

+0

Verwenden Sie Browserify? – kpimov

+0

Ja ich benutze browserify – thevangelist

+0

Benutzt du auch Babel? Was meinst du mit "styles.markdown"? – kpimov

Antwort

27

Erstellen Sie einfach eine einfache Komponente reagieren, die einen Anruf an einen Markdown-Parser wickelt. Es gibt zwei sehr gute für JavaScript:

Jetzt können Sie eine Komponente wie folgt 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}} />; 
    } 
}); 

verwendet Es gibt einen bereits zu haben, aber es scheint nicht mehr gepflegt zu werden: https://github.com/tcoopman/markdown-react

Wenn Sie einen React Markdown Editor benötigen, überprüfen Sie auch: react-mde. Haftungsausschluss: Ich bin der Autor.

+6

Nicht sicher, wann sich das geändert hat, aber ich habe es heute durchgearbeitet und React scheint nun ein Objekt mit einem __html-Feld anstatt nur zu benötigen eine Zeichenfolge (zB 'dangerInSetInnerHTML = {{__ html: markdown}}'). Auch wenn dies für die hier gestellte Frage möglicherweise nicht relevant ist, ist es doch wichtig, dass die Markdown-Bibliothek die Eingabe bereinigt, um XSS zu vermeiden, wenn eine davon möglicherweise nicht vertrauenswürdig ist (z. B. var markdown = markiert) .parse (this.props.markdown, {sanitize: true}); '). – GrandOpener

+0

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

+0

Danke mein Mann, es hat mir sehr geholfen! :-) –

4

versuchen, etwas wie folgt aus:

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 werden verwenden, müssen die brfs verwandeln können fs.readFileSync verwenden, wenn Dies läuft clientseitig.

+0

Ich kann 'fs' nicht innerhalb von react arbeiten. – Loourr

+0

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

6

Beispiel für Markdown-Komponente, die HTML aus Abschrift Text rendert, sollte die Logik des Ladens von Daten in separaten Speicher/Mutterkomponente/was auch immer implementiert werden. Ich benutze marked Paket zum Konvertieren von Abschriften 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: '' 
}; 
3

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

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

var src = "# Load the markdown document" 

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

Ich stimme @Oklas zu. Reactive-Markdown ist wahrscheinlich die beste Lösung. Ich habe gerade angefangen, es selbst zu benutzen. Achten Sie jedoch darauf, wie und welche Anführungsstriche Sie verwenden. Wenn Sie in es6 und darüber hinaus schreiben, können Code-Snippets Probleme verursachen. Zum Beispiel musste ich es6 in es5 transpilieren (benutzter babel transpiler auf ihrer Seite für Geschwindigkeit und Präzision), um Fehler zu entfernen, die ich wie "undefiniert" bekam. Seien Sie vorsichtig, dass es hier und da ein paar Herausforderungen in Bezug auf die Syntax gibt, für die Sie Workarounds finden müssen. –

+0

Und das ist der Diskussionsthread, den ich heute früher mit dem Ersteller des Plugins bezüglich des Problems hatte: https://github.com/rexxars/react-markdown/issues/91 rexxars war schnell zu antworten und extrem hilfreich! –

Verwandte Themen