Вот что я попробовал и как все идет не так.
Это работает:
<div dangerouslySetInnerHTML={{ __html: "<h1>Hi there!</h1>" }} />
Это не:
<div dangerouslySetInnerHTML={{ __html: this.props.match.description }} />
Свойство description - это просто обычная строка содержимого HTML. Однако по какой-то причине он отображается как строка, а не как HTML.
Какие-либо предложения?
javascript
html
reactjs
jsx
Серхио Тапиа
источник
источник
dangerouslySetInnerHTML
вместоFragment
реакции с v16. Проверьте следующий ответ от @ brad-adamsЯвляется
this.props.match.description
ли строка или объект? Если это строка, она должна быть преобразована в HTML. Пример:Результат: http://codepen.io/ilanus/pen/QKgoLA?editors=1011
Однако, если
description: <h1 style="color:red;">something</h1>
без кавычек''
вы получите:Если это строка и вы не видите никакой разметки HTML, единственная проблема, которую я вижу, это неправильная разметка.
ОБНОВИТЬ
Если вы имеете дело с HTMLEntitles. Вы должны декодировать их перед отправкой
dangerouslySetInnerHTML
, поэтому они называли это опасно :)Рабочий пример:
источник
this.props.match.description
это строка, а не объект. Что вы имеете в виду с неправильной разметкой? Вы имеете в виду незамкнутые теги? Реакт должен просто сделать это нет?<p><strong>Our Opportunity:</strong></p>
Я использую 'response-html-parser'
Источник на npmjs.com
Поднятие комментария @ okram для большей наглядности:
источник
Converts HTML strings directly into React components avoiding the need to use dangerouslySetInnerHTML
от npmjs.comA utility for converting HTML strings into React components. Avoids the use of dangerouslySetInnerHTML and converts standard HTML elements, attributes and inline styles into their React equivalents.
Если у вас есть контроль над тем, откуда берется строка, содержащая html (т.е. где-то в вашем приложении), вы можете воспользоваться новым
<Fragment>
API, выполнив что-то вроде:источник
Fragment
API мне всегда было больно, что требовало дополнительныхspan
обертываний, которые иногда мешали бы гибким макетам. Когда я наткнулся на этот вопрос в поисках возможного решения, я подумал, что поделюсь тем, как мне это удалось.Some text <strong>wrapped with strong</strong>
содержит html tagstrong
.Вы просто используете опасно SetInnerHTML метод React
<div dangerouslySetInnerHTML={{ __html: htmlString }} />
Или вы можете реализовать больше с помощью этого простого способа: рендеринга HTML raw в приложении React
источник
dangerouslySetInnerHTML
dangerouslySetInnerHTML - это замена React для использования innerHTML в DOM браузера. В общем, настройка HTML из кода рискованна, потому что легко непреднамеренно подвергнуть ваших пользователей атаке межсайтового скриптинга (XSS). Таким образом, вы можете установить HTML непосредственно из React, но вы должны ввести опасно SetInnerHTML и передать объект с ключом __html, чтобы напомнить себе, что это опасно. Например:
источник
Я использую innerHTML вместе ref для span:
источник
componentDidMount() { this.message.current.innerHTML = this.state.selectedMessage.body; }
body является для меня экранированным html.В моем случае я использовал response-render-html
Сначала установите пакет
npm i --save react-render-html
затем,
источник
Я не мог заставить
npm build
работатьreact-html-parser
. Однако в моем случае я смог успешно использовать https://reactjs.org/docs/fragments.html . У меня было требование показать несколько html символов Юникода, но они не должны быть непосредственно встроены в JSX. В JSX его нужно было выбирать из состояния компонента. Фрагмент кода компонента приведен ниже:источник
я использую https://www.npmjs.com/package/html-to-react
источник
Если у вас есть контроль над {this.props.match.description} и вы используете JSX. Я бы порекомендовал не использовать "dangerouslySetInnerHTML".
источник