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?

Aaron Beall
fuente
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>);
}
Sergio Flores
fuente
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 ).

andersvold
fuente
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.

Ladrillo Yang
fuente
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)

Philipp Munin
fuente
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.

joedotnot
fuente
0

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

Frederiko Cesar
fuente
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
Darshuu
fuente
0

Prueba este

render() {
    var text = "One\nTwo\nThree";
    return <div style={{whiteSpace: 'pre-line'}}>{text}</div>;
}
Codemaker
fuente
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.

trevoro
fuente
0
<div style={{ whiteSpace: "break-spaces" }}> {JSON.stringify(state, null, " ")} </div>
Adam Rybinski
fuente