Я показываю текст, который был сохранен в базе данных. Данные поступают из firebase в виде строки (с включенными перерывами в новой строке). Чтобы он отображался как HTML, я изначально сделал следующее:Как объединить компонент JSX с опасностьюSetInnerHTML
<p className="term-definition"
dangerouslySetInnerHTML={{__html: (definition.definition) ? definition.definition.replace(/(?:\r\n|\r|\n)/g, '<br />') : ''}}></p>
Это отлично работало. Однако есть еще одна особенность. Пользователи могут ввести [word]
, и это слово будет связано. Для того, чтобы достичь этого, я создал следующую функцию:
parseDefinitionText(text){
text = text.replace(/(?:\r\n|\r|\n)/g, '<br />');
text = text.replace(/\[([A-Za-z0-9'\-\s]+)\]/, function(match, word){
// Convert it to a permalink
return (<Link to={'/terms/' + this.permalink(word) + '/1'}>{word}</Link>);
}.bind(this));
return text;
},
я ушел из метода this.permalink
, как это не имеет значения. Как вы можете видеть, я пытаюсь вернуть компонент <Link>
, который был импортирован из response-router.However, поскольку это необработанный HTML, dangerouslySetInnerHTML
больше не работает должным образом.
Так что я как бы застрял в этой точке. Что я могу сделать для форматирования внутреннего текста и создания ссылки?
Что такое _.chain? Вы используете underscorejs? У меня нет этого как часть этого проекта, и я не хочу добавлять дополнительные зависимости. –
Это от 'lodash'. Очень похоже на подчеркивание, и довольно здорово. Я дал вам суть того, как вы могли бы создать парсер разметки - реализация зависит от вас. –
'_.chain' позволяет выполнять функции последовательно, подавая вход от одной функции к следующей. –