2015-08-07 21 views
13

Dokümanlarımı işaretli olarak yazdım ve bu dosyaları JSX (ES6 + CommonJS) kodumdan React bileşenlerine dönüştürmek istiyorum. Bunu nasıl başarabilirim?Markdown'u bir React bileşeninden nasıl görüntüleyebilirim?

Örneğin, styles.markdown var ve bunu bir <p> etiketine dönüştürmek istiyorum. Böyle

+0

Browserify kullanıyor musunuz? – kpimov

+0

Evet browserify kullanıyorum – thevangelist

+0

Babel kullanıyor musunuz? "Styles.markdown" özelliği ile ne demek istiyorsunuz? – kpimov

cevap

27

Sadece bir Markdown ayrıştırıcı bir çağrı sarar bir tepki basit bileşeni oluşturun.

Artık bir bileşen böyle oluşturabilirsiniz: JavaScript için iki çok iyi olanlar vardır

zaten bir tane var için kullanılan
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}} />; 
    } 
}); 

Orada, ama artık muhafaza edilmiyor gibi görünüyor: https://github.com/tcoopman/markdown-react

Ayrıca, bir React Markdown Düzenleyicisine ihtiyacınız varsa, aşağıdakilere göz atın: react-mde. Yasal Uyarı: Ben yazarım.

+6

Bu değiştiğinde emin değilim, ancak bugün bunun üzerinde çalışıyordum ve React artık bir nesne yerine bir __html alanıyla bir nesne gerektiriyor gibi görünüyor. bir dize (ör. 'dangerouslySetInnerHTML = {{__ html: markdown}}'). Ayrıca, burada sorulan soru ile ilgili olmamasına rağmen, işaretleme kütüphanesinin XSS'den kaçınmak için girişi sanitize etmesi tavsiye edilir. Eğer herhangi biri potansiyel olarak güvenilmezse (örneğin, "var" markdown = işaretli) .parse (this.props.markdown, {sanitize: true}); '). – GrandOpener

+0

Teşekkürler @GrandOpener. Cevabı buna göre güncelledim. –

+0

Teşekkürler adamım, bana çok yardımcı oldu! :-) –

4

deneyin şey:

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

Yoksa ES7 + özelliklerini kullanıyorsanız:

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

Sen brfs eğer fs.readFileSync kullanabilmek için dönüşümleri kullanılarak gerekecektir Bu istemci tarafı çalışıyor.

+0

Tepkimede çalışmak için fs'yi alamıyorum. – Loourr

+0

evet. fs bir düğüm modülüdür ve istemci tarafında çalışmaz (en azından bildiğim kadarıyla) – archae0pteryx

6

Markalama metninden html oluşturan Markdown bileşenine örnek olarak, yükleme verileri mantığı ayrı bir depoda/ana bileşende/her ne şekilde uygulanmalıdır. Markdown'u html'ye dönüştürmek için marked paketini kullanıyorum.

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

Markdown bileşeni ile paket react-markdown iyi seçim olacaktır: Geç partiye biraz olduğum

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

var src = "# Load the markdown document" 

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

@Oklas ile aynı fikirdeyim. tepki işaretleme muhtemelen en iyi çözümdür. Daha yeni kullanmaya başladım. Ancak, nasıl ve hangi tırnak veya arka kenelerin kullandığınıza dikkat edin. Es6 ve ötesine yazıyorsanız, kod parçacıkları sorunlara neden olabilir. Örneğin, "undefined" gibi birtakım hataları gidermek için es6'yı es5'e (hız ve hassasiyet için sitelerinde babil transpiler kullanmıştım) aktarmam gerekiyordu. Sadece burada ve orada geçici çözümler bulmak zorunda sözdizimi ile ilgili bazı zorluklar var dikkat edin. –

+0

Ve bu konuyla ilgili olarak eklentinin yaratıcısıyla bugün daha önce tartıştığım tartışma dizisidir: https://github.com/rexxars/react-markdown/issues/91 rexxars yanıt vermekte ve son derece faydalıydı! –

İlgili konular