У меня есть моя документация, написанная в методе уценки, и я хотел бы отобразить эти файлы из моего кода JSX (ES6 + CommonJS) в компоненты React. Как я могу достичь этого?
Например, у меня есть styles.markdown, и я хотел бы сделать его тегом <p>.
У меня есть моя документация, написанная в методе уценки, и я хотел бы отобразить эти файлы из моего кода JSX (ES6 + CommonJS) в компоненты React. Как я могу достичь этого?
Например, у меня есть styles.markdown, и я хотел бы сделать его тегом <p>.
Просто создайте простой компонент React, который переносит вызов анализатора Markdown. Есть два очень хороших для JavaScript:
Теперь вы можете создать такой компонент:
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}} />;
}
});
Раньше он уже был, но, похоже, он больше не поддерживается: https://github.com/tcoopman/markdown-react
Кроме того, если вам нужен редактор React Markdown, проверьте: response-mde. Отказ от ответственности: я автор.
Пакет react-markdown с компонентом Markdown будет хорошим выбором:
import React from 'react'
import Markdown from 'react-markdown'
var src = "# Load the markdown document"
React.render(
<Markdown source={src} />,
document.getElementById('root')
);
Пример компонента Markdown, который отображает html из текста разметки, логика загрузки данных должна быть реализована в отдельном хранилище/родительском компоненте/независимо. Я использую marked пакет для конвертирования уценки в 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: ''
};
Я немного опаздываю на вечеринку, но я написал библиотеку конкурента для упомянутых выше, которая имеет дополнительное преимущество: не нужно взламывать dangerouslySetInnerHtml: https://github.com/probablyup/markdown-to-jsx
Попробуйте что-то вроде этого:
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);
Или, если вы используете ES7+ функции:
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);
Вам нужно использовать преобразование brfs, чтобы иметь возможность использовать fs.readFileSync, если он выполняется на стороне клиента.