Cómo renderizar una cadena de texto de varias líneas en React


83

Supongamos que tengo una cadena de texto que contiene saltos de línea y la renderizo así:

render() {
    var text = "One\nTwo\nThree";
    return <div>{text}</div>;
}

En HTML, los saltos de línea no se representan como saltos de línea. ¿Cómo debo hacer esto en React? No quiero convertir a <br>etiquetas y usar dangerouslySetInnerHTML. ¿Hay otra manera?


Si lo usó, <br>ese podría ser el problema. He notado que al JS Transformer no le gusta a menos que use la <br/>versión HTML 4.
steviesama

Para asignar dos líneas de React-code a una variable, use paréntesis alrededor de ambas líneas. ()
Vael Victus

1
Arreglé esto usando preenvío. Aquí está mi respuesta a una pregunta similar: stackoverflow.com/a/55466235/5346095
JS dev

Respuestas:


73

Podrías intentar poner divs para cada línea

render() {
    return (<div>
        <div>{"One"}</div>
        <div>{"Two"}</div>
        <div>{"Three"}</div>
    </div>);
}

O

render() {
    var text = "One\nTwo\nThree";
    return (
    <div>
        {text.split("\n").map((i,key) => {
            return <div key={key}>{i}</div>;
        })}
    </div>);
}

5
Me gusta esto. ¡Creo que también podría hacer un <MultilineText>componente con él!
Aaron Beall

13
¿Por qué usarías <div>para formatear líneas de texto? <p>parece más semánticamente correcto.
kost

1
¿Es así en serio cómo se debe manejar? Entiendo que esto funciona, pero crea un lío en el marcado. ¿Qué pasa si el usuario quiere copiar este texto? Para ser justos, la falla aquí está en el manejo de React, no en su solución. Esta puede ser la mejor opción, pero vaya.
kevincoleman

1
Ni siquiera piense en reaccionar, piense en cómo puede manejar esto usando HTML. La mejor solución es, con mucho, crear los div, poner etiquetas BR o bloques de tramos. En mi opinión, este es el mismo escenario para HTML / react.
Sergio Flores

236

Crea una nueva clase CSS

.display-linebreak {
  white-space: pre-line;
}

Muestra tu texto con esa clase CSS

render() {
  const text = 'One \n Two \n Three';
  return ( 
     <div className="display-linebreak"> 
        {text} 
     </div>
  );
}

Renders con saltos de línea (las secuencias de espacios en blanco se colapsarán en un solo espacio en blanco. El texto se ajustará cuando sea necesario). Me gusta esto:

One
Two
Three

También puede considerar la pre-envoltura. Más información aquí ( Propiedad de espacios en blanco CSS ).


2
Esta es una gran alternativa a la respuesta que acepté y merece los votos positivos, pero creo que debería mencionar que lo probé y tuve problemas con el diseño / desbordamiento / renderizado; ninguna de las opciones de espacios en blanco parecía funcionar correctamente en todos los casos que necesitaba una solución en ese momento, mientras que la respuesta aceptada sí.
Aaron Beall

Seguro que es la mejor respuesta. Simplemente agregue el CSS y no es necesario usar el mapa ni nada más. Gracias.
Frederiko Cesar

26

Puede utilizar la propiedad CSS "white-space: pre". Creo que esta es la forma más fácil de manejar esto.


La mejor respuesta, en mi opinión: este es un problema de visualización, por lo que idealmente debería tratarse en css (no alterando el html)
Bogdan D

12
white-space:preTuvo el mismo efecto que white-space:nowrappara mí, es decir, el texto desbordó su contenedor. Usar en su white-space:pre-wraplugar resolvió esto.
rorymorris89

Solo el uso de "pre" resultará en que el texto exceda / no envuelva el contenedor. Úselo en su white-space: pre-line;lugar.
Frederiko Cesar

6

Aquí la solución más limpia (afaik):

   render(){
      return <pre>
             Line 1{"\n"}
             Line 2{"\n"}
             Line 3{"\n"}
      </pre>
   }

En lugar de, también puede usar <div style={{whiteSpace:"pre"}}>, o cualquier otro elemento de bloque html (como spano pcon este atributo de estilo)


Gracias después de probar varias formas, esta es la única solución que funcionó para mí.
Saurabh Rana

0

Renderice su texto delimitado "Mi línea uno \ nMi segunda línea \ nQué ..." dentro de un área de texto html normal. ¡Sé que funciona porque lo acabo de usar hoy! Haga que el área de texto sea readOnly si es necesario, y aplique el estilo correspondiente.


0

Puede usar -webkit-user-modify: read-write-plaintext-only;en su div. Formateará y comprenderá cosas como \ n y \ p, por ejemplo.


0

Puede hacer uso de la etiqueta textarea de html, luego puede agregar el estilo a la etiqueta textarea. Prácticamente resuelve todos sus problemas, incluidos los saltos de línea y los espacios de tabulación. Alegría ...

por ejemplo: su render se verá más abajo

render() {
    var text = "One\nTwo\nThree";
    return <textarea>{text}</textarea>;
}

Salida:

One
Two
Three

0

Prueba este

render() {
    var text = "One\nTwo\nThree";
    return <div style={{whiteSpace: 'pre-line'}}>{text}</div>;
}

0

En su lugar, puede ejecutar con seguridad String.raweste tipo de valor.

const text = String.raw`One
Two
Three
`
render() {
  return <div style={{ whiteSpace: "pre" }}>{text}</div>
}

También puede usar una <pre>etiqueta que efectivamente haga lo mismo, pero es menos clara semánticamente si ya la está usando para otros propósitos en su aplicación.


0
<div style={{ whiteSpace: "break-spaces" }}> {JSON.stringify(state, null, " ")} </div>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.