Então, esta é a única maneira de renderizar html bruto com reactjs?
// http://facebook.github.io/react/docs/tutorial.html
// tutorial7.js
var converter = new Showdown.converter();
var Comment = React.createClass({
render: function() {
var rawMarkup = converter.makeHtml(this.props.children.toString());
return (
<div className="comment">
<h2 className="commentAuthor">
{this.props.author}
</h2>
<span dangerouslySetInnerHTML={{__html: rawMarkup}} />
</div>
);
}
});
Eu sei que existem algumas maneiras legais de marcar coisas com JSX, mas estou principalmente interessado em poder renderizar html bruto (com todas as classes, estilos embutidos, etc.). Algo complicado como este:
<!-- http://getbootstrap.com/components/#dropdowns-example -->
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
Dropdown
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Separated link</a></li>
</ul>
</div>
Eu não gostaria de reescrever tudo isso em JSX.
Talvez eu esteja pensando nisso tudo errado. Por favor me corrija.
javascript
reactjs
vinhboy
fonte
fonte
Respostas:
Você pode aproveitar o
html-to-react
módulo npm.Nota: Sou o autor do módulo e o publiquei algumas horas atrás. Por favor, sinta-se livre para relatar quaisquer bugs ou problemas de usabilidade.
fonte
Agora existem métodos mais seguros para renderizar HTML. Eu cobri isso em uma resposta anterior aqui . Você tem 4 opções, os últimos usos
dangerouslySetInnerHTML
.Métodos para renderizar HTML
Mais fácil - use Unicode, salve o arquivo como UTF-8 e defina-o
charset
como UTF-8.<div>{'First · Second'}</div>
Mais seguro - use o número Unicode para a entidade dentro de uma string Javascript.
<div>{'First \u00b7 Second'}</div>
ou
<div>{'First ' + String.fromCharCode(183) + ' Second'}</div>
Ou uma matriz mista com strings e elementos JSX.
<div>{['First ', <span>·</span>, ' Second']}</div>
Último recurso - insira HTML bruto usando
dangerouslySetInnerHTML
.<div dangerouslySetInnerHTML={{__html: 'First · Second'}} />
fonte
dangerouslySetInnerHTML
além __htmlEu usei isso em situações rápidas e sujas:
fonte
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onload="alert('test');">
?Eu tentei este componente puro:
Recursos
className
prop (mais fácil de estilizar)\n
para<br />
(você costuma fazer isso)<RawHTML>{myHTML}</RawHTML>
Coloquei o componente em um Gist no Github: RawHTML: ReactJS puro componente para renderizar HTML
fonte
fonte
dangerouslySetInnerHTML é o substituto do React para o uso do innerHTML no DOM do navegador. Em geral, definir HTML a partir do código é arriscado, pois é fácil expor inadvertidamente seus usuários a um ataque de XSS (cross-site scripting).
É melhor / mais seguro higienizar seu HTML bruto (usando, por exemplo, DOMPurify) antes de injetá-lo no DOM via
dangerouslySetInnerHTML
.DOMPurify - um desinfetante XSS exclusivo para DOM, super-rápido e tolerante a uber para HTML, MathML e SVG. O DOMPurify funciona com um padrão seguro, mas oferece muita configurabilidade e ganchos.
Exemplo :
fonte
Eu usei essa biblioteca chamada Parser . Funcionou para o que eu precisava.
fonte
dangerouslySetInnerHTML
não deve ser usado, a menos que seja absolutamente necessário. De acordo com os documentos, "Isso é principalmente para cooperar com as bibliotecas de manipulação de string do DOM" . Ao usá-lo, você está perdendo os benefícios do gerenciamento de DOM do React.No seu caso, é bastante simples converter para sintaxe JSX válida; basta alterar os
class
atributos paraclassName
. Ou, como mencionado nos comentários acima, você pode usar a biblioteca ReactBootstrap que encapsula elementos do Bootstrap nos componentes do React.fonte
Aqui está uma versão um pouco menos opinativa da função RawHTML publicada anteriormente. Permite:
<br />
'sRawHTML></RawHTML>
)Aqui está o componente:
Uso:
Resultado:
Irá quebrar:
fonte
Eu precisava usar um link com o atributo onLoad na minha cabeça, onde div não é permitido, então isso me causou uma dor significativa. Minha solução atual é fechar a tag de script original, fazer o que preciso e abrir a tag de script (a ser fechada pelo original). Espero que isso ajude alguém que não tem outra escolha:
fonte