Я хочу иметь возможность передавать текст с помощью тегов HTML, например:
<MyComponent text="This is <strong>not</strong> working." />
Но внутри MyComponent
метода render, когда я распечатываю this.props.text
, он буквально выводит все:
This is <strong>not</strong> working.
Есть ли способ заставить React анализировать HTML и правильно его выгружать?
<MyComponent>This is <strong>not</strong> working</MyComponent>
, а не передавать их как свойства. Не могли бы вы подробнее рассказать о том, чего вы на самом деле пытаетесь достичь?Ответы:
Вы можете использовать смешанные массивы со строками и элементами JSX (см. Документацию здесь ):
Здесь есть скрипка, которая показывает, что она работает: http://jsfiddle.net/7s7dee6L/
Кроме того, в крайнем случае у вас всегда есть возможность вставить необработанный HTML, но будьте осторожны, потому что это может открыть вас для атаки межсайтового скриптинга (XSS), если не очистить значения свойств.
источник
{text.map( textOrHTML, index) => <span key={index}>{textOrHTML}</span> )}
Хотя это так странно, что мы должны сделать это в первую очередь полностью.key="[some unique value]"
на<strong>
элемент.<MyComponent text={<>This is <strong>not</strong> working.</>} />
На самом деле, есть несколько способов добиться этого.
Вы хотите использовать JSX в своем реквизите
Вы можете просто использовать {}, чтобы JSX проанализировал параметр. Единственное ограничение такое же, как и для каждого элемента JSX: он должен возвращать только один корневой элемент.
Лучший читаемый способ сделать это - создать функцию renderMyProp, которая будет возвращать компоненты JSX (точно так же, как стандартная функция рендеринга), а затем просто вызвать myProp = {this.renderMyProp ()}
Вы хотите передать только HTML в виде строки
По умолчанию JSX не позволяет отображать необработанный HTML из строковых значений. Однако есть способ добиться этого:
Затем в своем компоненте вы можете использовать его так:
Помните, что это решение «может» открываться при атаках подделки межсайтовых сценариев. Также имейте в виду, что вы можете отображать только простой HTML, без тегов JSX, компонентов или других причудливых вещей.
Путь массива
В ответ вы можете передать массив элементов JSX. Это значит:
Я бы не рекомендовал этот метод, потому что:
Детский путь
Добавив его для полноты картины, но в качестве реакции, вы также можете получить всех дочерних элементов, находящихся «внутри» вашего компонента.
Итак, если я возьму следующий код:
Тогда два div будут доступны как this.props.children в SomeComponent и могут быть отображены с использованием стандартного синтаксиса {}.
Это решение идеально, если у вас есть только один HTML-контент для передачи вашему компоненту (представьте себе компонент Popin, который принимает только содержимое Popin в качестве дочерних).
Однако, если у вас есть несколько содержимого, вы не можете использовать дочерние элементы (или вам нужно хотя бы объединить его с другим решением здесь)
источник
this.props.children
. Без 's' reactjs.org/docs/glossary.html#propschildrenВы можете использовать опасноSetInnerHTML
Просто отправьте html как обычную строку
И отрендерить в JSX-коде вот так:
Просто будьте осторожны, если вы визуализируете данные, введенные пользователем. Вы можете стать жертвой XSS-атаки
Вот документация: https://facebook.github.io/react/tips/dangerously-set-inner-html.html.
источник
а затем в своем компоненте вы можете выполнить проверку опоры следующим образом:
Убедитесь, что вы выбрали только один тип опоры.
источник
Начиная с React v16.02 вы можете использовать фрагмент.
Подробнее: https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html
источник
Для меня это сработало, передав тег html в props children
источник
В приложении реакции на стороне клиента есть несколько способов отрисовки опоры в виде строки с некоторым HTML. Один безопаснее другого ...
1 - Определите опору как jsx (мое предпочтение)
• Единственное требование здесь заключается в том, что любой файл, генерирующий эту опору, должен включать React в качестве зависимости (в случае, если вы генерируете jsx опоры во вспомогательном файле и т. Д.).
2 - Опасно установить innerHtml
• Этот второй подход не рекомендуется. Представьте себе поле ввода, входное значение которого отображается как опора в этом компоненте. Пользователь может ввести тег сценария во входные данные, и компонент, который отображает эти входные данные, будет выполнять этот потенциально вредоносный код. Таким образом, такой подход может привести к уязвимости межсайтового скриптинга. Для получения дополнительной информации обратитесь к официальной документации React.
источник
Установите любой тип опоры для текста и сделайте следующее:
пример
источник
Вы можете сделать это двумя известными мне способами.
1-
<MyComponent text={<p>This is <strong>not</strong> working.</p>} />
А потом сделай это
Или второй подход, сделайте это так
2-
<MyComponent><p>This is <strong>not</strong> working.</p><MyComponent/>
А потом сделай это
источник
let vhtml = "<p>Test</p>"
и использовал ее в опоре вот так,text={vhtml}
и по какой-то причине она все еще отображается в виде обычного текста.Ответ @matagus подходит для меня, Надеюсь, что приведенный ниже фрагмент поможет тем, кто хочет использовать переменную внутри.
источник
В моем проекте мне пришлось передать динамический фрагмент html из переменной и отобразить его внутри компонента. Итак, я сделал следующее.
объект defaultSelection передается компоненту из
.js
файлаКомпонент HtmlSnippet
Пример Plunkr
реагировать на документ для опасногоSetInnerHTML
источник
Вы также можете использовать функцию в компоненте для передачи jsx через props. лайк:
источник
Да, вы можете это сделать, используя массив смешивания со строками и элементами JSX. ссылка
источник
Парсер от html-react-parser - хорошее решение. Тебе просто нужно
назовите это с:
и это хорошо работает.
источник
Дополнение к ответу: если вы собираетесь анализировать и уже используете JSX, но имеете объект с вложенными свойствами, очень элегантным способом является использование круглых скобок для принудительного анализа JSX:
источник
На этот вопрос уже есть много ответов, но я делал что-то не так в связи с этим, и я думаю, что стоит поделиться:
У меня было примерно так:
но массаж был более продолжительным, поэтому я попробовал использовать что-то вроде этого:
Мне потребовалось некоторое время, чтобы понять, что мне не хватает () в вызове функции.
Не работает
Работает
может быть, это поможет тебе, как и мне!
источник
Вы можете успешно использовать для этой задачи фрагменты React . В зависимости от React используемой версии, вы можете использовать короткий синтаксис:
<>
или полный тег:<React.Fragment>
. Особенно хорошо работает, если вы не хотите заключать всю строку в теги HTML.источник
Таким образом мы можем сделать то же самое.
теперь вы хотите отправить этот HTML-код внутри другого компонента, имя которого - родительский компонент.
Звонок: -
Использование ребенка: -
эта работа идеально подходит для меня.
источник
Добавили html в componentDidMount с помощью jQuery append. Это должно решить проблему.
источник