2015-08-07 12 views
13

Tôi có tài liệu được viết bằng cách đánh dấu và tôi muốn hiển thị các tệp đó từ mã JSX (ES6 + CommonJS) của tôi thành các thành phần React. Làm thế nào tôi có thể đạt được điều này?Làm cách nào để hiển thị Markdown từ thành phần React?

Ví dụ: tôi có kiểu.markdown và tôi muốn hiển thị nó thành một thẻ <p>.

+0

Bạn có đang sử dụng Browserify không? – kpimov

+0

Có Tôi đang sử dụng trình duyệt số – thevangelist

+0

Bạn có đang sử dụng Babel không? Bạn có ý nghĩa gì khi có 'styles.markdown'? – kpimov

Trả lời

27

Chỉ cần tạo một thành phần đơn giản Phản ứng bọc lấy một cuộc gọi đến một phân tích cú pháp Markdown. Có hai người rất tốt cho JavaScript:

Bây giờ bạn có thể tạo một thành phần như thế này:

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

Có sử dụng để có số này, nhưng dường như không còn được duy trì nữa: https://github.com/tcoopman/markdown-react

Ngoài ra, nếu bạn cần Trình chỉnh sửa phản hồi đánh dấu, hãy kiểm tra: react-mde. Disclaimer: Tôi là tác giả.

+6

Không chắc chắn khi điều này thay đổi, nhưng tôi đã làm việc thông qua nó ngày hôm nay và React xuất hiện bây giờ yêu cầu một đối tượng với một trường __html thay vì một chuỗi (ví dụ: 'dangerouslySetInnerHTML = {{__ html: markdown}}'). Ngoài ra, mặc dù nó có thể không liên quan đến câu hỏi được yêu cầu ở đây, cần lưu ý rằng thư viện markdown sẽ khử trùng đầu vào để tránh XSS, nếu bất kỳ phần nào có khả năng không tin cậy (ví dụ 'var markdown = marked .parse (this.props.markdown, {sanitize: true}); '). – GrandOpener

+0

Cảm ơn @GrandOpener. Tôi đã cập nhật câu trả lời cho phù hợp. –

+0

Cảm ơn bạn, tôi đã giúp tôi rất nhiều! :-) –

4

Hãy thử một cái gì đó như thế này:

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

Hoặc nếu bạn đang sử dụng ES7 + các tính năng:

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

Bạn sẽ cần phải sử dụng brfs chuyển đổi để có thể sử dụng fs.readFileSync nếu điều này đang chạy phía máy khách.

+0

Tôi không thể nhận được 'fs' để làm việc trong phản ứng. – Loourr

+0

vâng. fs là một mô-đun nút và sẽ không làm việc phía máy khách (ít nhất là tôi biết) – archae0pteryx

6

Ví dụ về thành phần Markdown hiển thị html từ văn bản đánh dấu, logic của dữ liệu tải nên được triển khai trong cửa hàng riêng biệt/thành phần chính/bất kỳ thứ gì. Tôi đang sử dụng gói marked để chuyển đổi markdown thành 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

Gói react-markdown với Markdown phần sẽ là sự lựa chọn tốt:

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

var src = "# Load the markdown document" 

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

Tôi đồng ý với @Oklas. phản ứng-markdown có lẽ là giải pháp tốt nhất. Tôi chỉ mới bắt đầu sử dụng nó. Tuy nhiên, hãy cẩn thận về cách thức và dấu ngoặc kép hoặc dấu tích nào bạn sử dụng. Nếu bạn viết bằng es6 và hơn thế nữa, đoạn mã có thể gây ra vấn đề. Ví dụ, tôi phải chuyển es6 thành es5 (sử dụng trình thu thập thông tin của babel trên trang web của họ để có tốc độ và độ chính xác) để loại bỏ các lỗi mà tôi nhận được như "không xác định". Chỉ cần cẩn thận rằng có một vài thách thức ở đây và có liên quan đến cú pháp mà bạn phải tìm ra giải pháp cho. –

+0

Và đây là chủ đề thảo luận mà tôi đã có ngày hôm nay với người sáng tạo của plugin về vấn đề này: https://github.com/rexxars/react-markdown/issues/91 rexxars đã nhanh chóng phản hồi và cực kỳ hữu ích! –

Các vấn đề liên quan