Entonces, ¿es esta la única forma de procesar html sin procesar con 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>
);
}
});
Sé que hay algunas formas geniales de marcar cosas con JSX, pero estoy principalmente interesado en poder procesar html sin formato (con todas las clases, estilos en línea, 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>
No me gustaría tener que reescribir todo eso en JSX.
Tal vez estoy pensando en todo esto mal. Por favor corrigeme.
javascript
reactjs
vinhboy
fuente
fuente
Respuestas:
Puede aprovechar el
html-to-react
módulo npm.Nota: Soy el autor del módulo y lo publiqué hace unas horas. No dude en informar cualquier error o problema de usabilidad.
fuente
Ahora hay métodos más seguros para representar HTML. Cubrí esto en una respuesta anterior aquí . Tienes 4 opciones, los últimos usos
dangerouslySetInnerHTML
.Métodos para renderizar HTML
Más fácil : use Unicode, guarde el archivo como UTF-8 y
charset
configúrelo en UTF-8.<div>{'First · Second'}</div>
Más seguro : use el número Unicode para la entidad dentro de una cadena Javascript.
<div>{'First \u00b7 Second'}</div>
o
<div>{'First ' + String.fromCharCode(183) + ' Second'}</div>
O una matriz mixta con cadenas y elementos JSX.
<div>{['First ', <span>·</span>, ' Second']}</div>
Último recurso : inserte HTML sin formato utilizando
dangerouslySetInnerHTML
.<div dangerouslySetInnerHTML={{__html: 'First · Second'}} />
fuente
dangerouslySetInnerHTML
además de __htmlHe usado esto en situaciones rápidas y sucias:
fuente
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onload="alert('test');">
?He probado este componente puro:
Caracteristicas
className
accesorios (más fácil de peinar)\n
a<br />
(a menudo quieres hacer eso)<RawHTML>{myHTML}</RawHTML>
He colocado el componente en un Gist en Github: RawHTML: componente puro ReactJS para renderizar HTML
fuente
fuente
dangerouslySetInnerHTML es el reemplazo de React para usar innerHTML en el navegador DOM. En general, establecer HTML a partir del código es arriesgado porque es fácil exponer a sus usuarios sin darse cuenta a un ataque de secuencias de comandos entre sitios (XSS).
Es mejor / más seguro desinfectar su HTML sin formato (usando, por ejemplo, DOMPurify) antes de inyectarlo en el DOM a través de
dangerouslySetInnerHTML
.DOMPurify : un desinfectante XSS súper rápido, súper rápido y solo para DOM para HTML, MathML y SVG. DOMPurify funciona con un valor predeterminado seguro, pero ofrece mucha capacidad de configuración y ganchos.
Ejemplo :
fuente
Usé esta biblioteca llamada Parser . Funcionó para lo que necesitaba.
fuente
dangerouslySetInnerHTML
no debe usarse a menos que sea absolutamente necesario. Según los documentos, "Esto es principalmente para cooperar con las bibliotecas de manipulación de cadenas DOM" . Cuando lo usas, estás renunciando al beneficio de la administración DOM de React.En su caso, es bastante sencillo convertir a una sintaxis JSX válida; solo cambia los
class
atributos aclassName
. O, como se menciona en los comentarios anteriores, puede usar la biblioteca ReactBootstrap que encapsula elementos Bootstrap en componentes React.fuente
Aquí hay una versión menos obstinada de la función RawHTML publicada anteriormente. Te permite:
<br />
'sRawHTML></RawHTML>
)Aquí está el componente:
Uso:
Salida:
Se romperá en:
fuente
Necesitaba usar un enlace con el atributo onLoad en mi cabeza donde div no está permitido, así que esto me causó un dolor significativo. Mi solución actual es cerrar la etiqueta del script original, hacer lo que necesito hacer y luego abrir la etiqueta del script (para que el original la cierre). Espero que esto pueda ayudar a alguien que no tiene otra opción:
fuente