2015-08-07 13 views

risposta

27

Basta creare un semplice React componente che avvolge una chiamata a un parser Markdown. Ci sono due quelli molto buone per JavaScript:

Ora è possibile creare un componente come questo:

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

usato per avere già uno, ma non sembra più essere mantenuto: https://github.com/tcoopman/markdown-react

Inoltre, se è necessario un editor React Markdown, eseguire il check-out: react-mde. Disclaimer: I am the author.

+6

Non sono sicuro quando questo è cambiato, ma stavo lavorando su di esso oggi e React sembra ora richiedere un oggetto con un campo __html piuttosto che solo una stringa (ad es. 'dangerouslySetInnerHTML = {{__ html: markdown}}'). Inoltre, anche se potrebbe non essere pertinente alla domanda qui posta, vale la pena notare che si consiglia a una libreria markdown di sanitizzare l'input per evitare XSS, se qualcuna di esse è potenzialmente non sicura (ad esempio 'var markdown = marked .parse (this.props.markdown, {sanitize: true}); '). – GrandOpener

+0

Grazie a @GrandOpener. Ho aggiornato la risposta di conseguenza. –

+0

Grazie amico mio, mi ha aiutato molto! :-) –

4

provare qualcosa di simile:

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

Oppure, se si sta utilizzando ES7 + caratteristiche:

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

Avrete bisogno di usare il brfs trasformazione per essere in grado di utilizzare fs.readFileSync se questo è in esecuzione sul lato client.

+0

Non riesco a far funzionare 'fs' dentro a reagire. – Loourr

+0

sì. fs è un modulo nodo e non funzionerà lato client (almeno per quanto ne so) – archae0pteryx

6

Esempio di componente Markdown che esegue il rendering di html dal testo di markdown, la logica di caricamento dei dati deve essere implementata in un archivio separato/componente principale/altro. Sto usando il pacchetto marked per convertire 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: '' 
}; 
3

Il pacchetto react-markdown con Markdown componente sarà buona scelta:

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

var src = "# Load the markdown document" 

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

Sono d'accordo con @Oklas. react-markdown è probabilmente la soluzione migliore. Ho appena iniziato a usarlo da solo. Tuttavia, fai attenzione a come e a quali virgolette o tick posteriori usi. Se scrivi in ​​es6 e oltre, i frammenti di codice possono causare problemi. Per esempio, ho dovuto traspolare es6 in es5 (usato il traspolatore Babel sul loro sito per velocità e precisione) al fine di rimuovere gli errori che stavo diventando "indefiniti". Basta fare attenzione che ci sono alcune sfide qui e là per quanto riguarda la sintassi che devi capire soluzioni alternative per. –

+0

E questo è il thread di discussione che ho avuto in precedenza oggi con il creatore del plugin per quanto riguarda il problema: https://github.com/rexxars/react-markdown/issues/91 rexxars è stato veloce a rispondere ed estremamente utile! –

Problemi correlati