Esto es lo que probé y cómo sale mal.
Esto funciona:
<div dangerouslySetInnerHTML={{ __html: "<h1>Hi there!</h1>" }} />
Esto no:
<div dangerouslySetInnerHTML={{ __html: this.props.match.description }} />
La propiedad de descripción es solo una cadena normal de contenido HTML. Sin embargo, se representa como una cadena, no como HTML por alguna razón.
¿Alguna sugerencia?
javascript
html
reactjs
jsx
Sergio Tapia
fuente
fuente
dangerouslySetInnerHTML
lugar de usarFragment
react v16. Compruebe la próxima respuesta de @ brad-adams¿
this.props.match.description
Es una cadena o un objeto? Si es una cadena, debe convertirse a HTML perfectamente. Ejemplo:Resultado: http://codepen.io/ilanus/pen/QKgoLA?editors=1011
Sin embargo, si
description: <h1 style="color:red;">something</h1>
sin las comillas''
vas a obtener:Si es una cadena y no ve ningún marcado HTML, el único problema que veo es un marcado incorrecto.
ACTUALIZAR
Si se trata de títulos HTMLE. Debes decodificarlos antes de enviarlos
dangerouslySetInnerHTML
, por eso lo llamaron peligrosamente :)Ejemplo de trabajo:
fuente
this.props.match.description
es una cadena, no un objeto. ¿Qué quieres decir con marcado incorrecto? ¿Te refieres a etiquetas no cerradas? Reaccionar solo debería hacer que no?<p><strong>Our Opportunity:</strong></p>
Yo uso 'react-html-parser'
Fuente en npmjs.com
Levantando el comentario de @ okram para mayor visibilidad:
fuente
Converts HTML strings directly into React components avoiding the need to use dangerouslySetInnerHTML
de 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.
Si tiene control sobre el origen de la cadena que contiene html (es decir, en algún lugar de su aplicación), puede beneficiarse de la nueva
<Fragment>
API, haciendo algo como:fuente
Fragment
API, siempre fue un dolor para mí, que requeríaspan
envolturas adicionales que a veces se complicaban con los diseños flexibles. Cuando me encontré con esta pregunta en busca de una posible solución que pensé en compartir la forma en que llegué alrededor de las cosas.Some text <strong>wrapped with strong</strong>
contiene la etiqueta htmlstrong
.Simplemente usa el método peligrosamente SetInnerHTML de React
<div dangerouslySetInnerHTML={{ __html: htmlString }} />
O puede implementar más de esta manera fácil: renderice el HTML sin procesar en la aplicación React
fuente
dangerouslySetInnerHTML
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 inadvertidamente a un ataque de scripting entre sitios (XSS). Por lo tanto, puede configurar HTML directamente desde React, pero debe escribir peligrosamente SetInnerHTML y pasar un objeto con una clave __html, para recordar que es peligroso. Por ejemplo:
fuente
Yo uso innerHTML juntos una referencia para abarcar:
fuente
componentDidMount() { this.message.current.innerHTML = this.state.selectedMessage.body; }
body es el html escapado para mí.En mi caso, utilicé react-render-html
Primero instale el paquete por
npm i --save react-render-html
luego,
fuente
No pude llegar
npm build
a trabajarreact-html-parser
. Sin embargo, en mi caso, pude utilizar con éxito https://reactjs.org/docs/fragments.html . Tenía el requisito de mostrar algunos caracteres HTML Unicode, pero no deberían incrustarse directamente en el JSX. Dentro del JSX, tuvo que ser elegido del estado del Componente. El fragmento de código de componente se proporciona a continuación:fuente
yo uso https://www.npmjs.com/package/html-to-react
fuente
Si tiene control sobre {this.props.match.description} y está utilizando JSX. Yo recomendaría no usar "dangerouslySetInnerHTML".
fuente