From React Docs:
В общем, установка HTML из кода рискованна, потому что легко случайно подвергнуть ваших пользователей межсайтовому скриптингу (XSS) атака. Итак, вы можете установить HTML прямо из React, но вам нужно ввести опасноSetInner HTML и передать объект с ключом __ html, чтобы напомнить себе, что это опасно.
Если вы не хотите использовать dangerouslySetInnerHTML
, вы можете использовать регулярное выражение для обертывания строки тегами html. Таким образом, вам не нужно передавать html сущностей в строке. Вы просто передаете строку и оборачиваете строку тегом html, используя функцию .replace()
.
Поскольку вы также хотите, чтобы строка анализировалась как HTML, вы можете передать дополнительную опору в Hello
компонент, который затем используется для обертывания строки желаемым тегом html, а также для визуализации строки, вложенной в желаемый тег html
function HTMLTag({ tag, children }) {
return React.createElement(tag, null, children);
}
class Hello extends React.Component {
render() {
const { name, tag } = this.props;
const str = name.replace(/(.+)/, `<${tag}>$1</${tag}>`);
return (
<div>
<HTMLTag tag={tag}>{str}</HTMLTag>
</div>
);
}
}
class HelloOther extends React.Component {
render() {
const name = "How are you?";
return <Hello name={name} tag="h3" />;
}
}
ReactDOM.render(
<Hello name="How are you?" tag="p" />,
document.getElementById('container')
);
ReactDOM.render(
<HelloOther />,
document.getElementById('container2')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="container"></div>
<div id="container2"></div>