Quiero poder pasar texto con etiquetas HTML, así:
<MyComponent text="This is <strong>not</strong> working." />
Pero dentro del MyComponent
método de renderizado de, cuando imprimo this.props.text
, literalmente imprime todo:
This is <strong>not</strong> working.
¿Hay alguna forma de hacer que React analice HTML y lo descargue correctamente?
<MyComponent>This is <strong>not</strong> working</MyComponent>
, en lugar de pasarlos como accesorios. ¿Podría dar más contexto sobre lo que realmente está tratando de lograr?Respuestas:
Puede usar matrices mixtas con cadenas y elementos JSX (consulte los documentos aquí ):
Aquí hay un violín que muestra que funciona: http://jsfiddle.net/7s7dee6L/
Además, como último recurso, siempre tiene la capacidad de insertar HTML sin procesar, pero tenga cuidado porque eso puede exponerlo a un ataque de secuencias de comandos entre sitios (XSS) si no está saneando los valores de propiedad.
fuente
{text.map( textOrHTML, index) => <span key={index}>{textOrHTML}</span> )}
Aunque, es tan extraño que tengamos que hacer esto en primer lugar por completo.key="[some unique value]"
el<strong>
elemento.<MyComponent text={<>This is <strong>not</strong> working.</>} />
En realidad, hay varias formas de hacerlo.
Quieres usar JSX dentro de tus accesorios
Simplemente puede usar {} para hacer que JSX analice el parámetro. La única limitación es la misma que para todos los elementos JSX: debe devolver solo un elemento raíz.
La mejor manera legible de hacerlo es crear una función renderMyProp que devolverá componentes JSX (como la función de render estándar) y luego simplemente llamar a myProp = {this.renderMyProp ()}
Quieres pasar solo HTML como una cadena
De forma predeterminada, JSX no le permite representar HTML sin formato a partir de valores de cadena. Sin embargo, hay una forma de hacerlo:
Luego, en su componente, puede usarlo así:
Tenga en cuenta que esta solución 'puede' abrirse en ataques de falsificación de secuencias de comandos entre sitios. También tenga en cuenta que solo puede renderizar HTML simple, sin etiquetas o componentes JSX u otras cosas sofisticadas.
La forma de matriz
En reaccionar, puede pasar una matriz de elementos JSX. Eso significa:
No recomendaría este método porque:
El camino de los niños
Agregándolo en aras de la integridad, pero en reacción, también puede obtener todos los elementos secundarios que están "dentro" de su componente.
Entonces, si tomo el siguiente código:
Entonces, los dos divs estarán disponibles como this.props.children en SomeComponent y se pueden representar con la sintaxis {} estándar.
Esta solución es perfecta cuando solo tiene un contenido HTML para pasar a su Componente (Imagine un componente de Popin que solo toma el contenido de Popin como hijos).
Sin embargo, si tiene varios contenidos, no puede usar niños (o necesita al menos combinarlo con otra solución aquí)
fuente
this.props.children
. Sin 's' reactjs.org/docs/glossary.html#propschildrenPuede usar dangerouslySetInnerHTML
Simplemente envíe el html como una cadena normal
Y renderice en el código JSX así:
Solo tenga cuidado si está procesando datos ingresados por el usuario. Puede ser víctima de un ataque XSS
Aquí está la documentación: https://facebook.github.io/react/tips/dangerously-set-inner-html.html
fuente
y luego en su componente puede hacer la comprobación de prop así:
Asegúrate de elegir solo un tipo de accesorio.
fuente
Para mí funcionó al pasar la etiqueta html en props children
fuente
Desde React v16.02 puedes usar un Fragmento.
Más información: https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html
fuente
En una aplicación de reacción del lado del cliente, hay un par de formas de representar un prop como una cadena con algo de html. Uno más seguro que el otro ...
1 - Defina el prop como jsx (mi preferencia)
• El único requisito aquí es que cualquier archivo que genere este accesorio debe incluir React como dependencia (en caso de que esté generando el jsx del accesorio en un archivo auxiliar, etc.).
2 - Establecer peligrosamente el innerHtml
• Se desaconseja este segundo enfoque. Imagine un campo de entrada cuyo valor de entrada se representa como un accesorio en este componente. Un usuario podría ingresar una etiqueta de secuencia de comandos en la entrada y el componente que presenta esta entrada ejecutaría este código potencialmente malicioso. Como tal, este enfoque tiene el potencial de introducir vulnerabilidades de secuencias de comandos entre sitios. Para obtener más información, consulte los documentos oficiales de React.
fuente
Establezca el tipo de apoyo de texto en cualquiera y haga esto:
Ejemplo
fuente
Puede hacerlo de 2 formas que yo sepa.
1-
<MyComponent text={<p>This is <strong>not</strong> working.</p>} />
Y luego haz esto
O segundo enfoque, hazlo así
2-
<MyComponent><p>This is <strong>not</strong> working.</p><MyComponent/>
Y luego haz esto
fuente
let vhtml = "<p>Test</p>"
y la usé en el accesorio de esta maneratext={vhtml}
y todavía se muestra en texto sin formato por alguna razón.La respuesta de @matagus está bien para mí, Hope debajo del fragmento ayuda a aquellos que desean usar una variable interna.
fuente
En mi proyecto, tuve que pasar un fragmento de código HTML dinámico de la variable y representarlo dentro del componente. Entonces hice lo siguiente.
El objeto defaultSelection se pasa al componente desde el
.js
archivoComponente HtmlSnippet
Ejemplo de Plunkr
reaccionar doc para dangerouslySetInnerHTML
fuente
También puede usar una función en el componente para pasar jsx a través de accesorios. me gusta:
fuente
Sí, puede hacerlo utilizando una matriz mixta con cadenas y elementos JSX. referencia
fuente
El analizador de html-react-parser es una buena solución. Sólo tienes que
llámalo con:
y funciona bien.
fuente
Agregando a la respuesta: si tiene la intención de analizar y ya está en JSX pero tiene un objeto con propiedades anidadas, una forma muy elegante es usar paréntesis para forzar el análisis JSX:
fuente
Esta pregunta ya tiene muchas respuestas, pero estaba haciendo algo mal relacionado con esto y creo que vale la pena compartirlo:
Tuve algo como esto:
pero el masaje fue más largo que eso, así que intenté usar algo como esto:
Me tomó un tiempo darme cuenta de que me faltaba el () en la llamada a la función.
No funciona
Trabajando
tal vez esto te ayude, ¡como a mí!
fuente
Puede utilizar con éxito fragmentos de React para esta tarea. Dependiendo de la versión que utiliza Reaccionar, puede utilizar la sintaxis corta:
<>
o la etiqueta completa:<React.Fragment>
. Funciona especialmente bien si no desea envolver toda la cadena dentro de etiquetas HTML.fuente
Podemos hacer lo mismo de esa manera.
ahora desea enviar este HTML dentro de otro componente cuyo nombre es Componente principal.
Llamando: -
Uso del niño: -
este trabajo perfecto para mi.
fuente
He agregado el html en componentDidMount usando jQuery append. Esto deberia resolver el problema.
fuente