¿Cómo puedo insertar un salto de línea en un componente <Texto> en React Native?

336

Quiero insertar una nueva línea (como \ r \ n, <br />) en un componente de texto en React Native.

Si tengo:

<text><br />
Hi~<br >
this is a test message.<br />
</text>

Luego reacciona renderizaciones nativas Hi~ this is a test message.

¿Es posible renderizar texto para agregar una nueva línea así:

Hi~
this is a test message.
Curtis
fuente
Puedes usar \ndonde quieras romper la línea.
Sam009

Respuestas:

655

Esto debería hacerlo:

<Text>
Hi~{"\n"}
this is a test message.
</Text>
Chris Ghenea
fuente
21
¿Hay alguna manera de hacerlo con una cadena de variable para poder usar <Text>{content}</Text>:?
Roman Sklenar
2
\ n es un salto de línea
Chris Ghenea
8
Gracias por esto. Terminé haciendo un componente de salto de línea para un acceso rápido var Br = React.createClass({ render() { return ( <Text> {"\n"}{"\n"} </Text> ) } })
Jonathan Lockley
44
¿Qué pasa si el texto está en una variable de cadena? <Text>{comments}</Text>No podemos usar la {\n}lógica allí. ¿Entonces como?
user2078023
2
Si el texto proviene de un accesorio, asegúrese de pasarlo de esta manera: en <Component text={"Line1\nLine2"} />lugar de <Component text="Line1\nLine2" />(observe las llaves añadidas)
qwertzguy
92

También puedes hacer:

<Text>{`
Hi~
this is a test message.
`}</Text>

Más fácil en mi opinión, porque no tienes que insertar cosas dentro de la cadena; solo envuélvelo una vez y mantendrá todos tus saltos de línea.

Venryx
fuente
77
Esta es la solución más limpia hasta ahora, junto conwhite-space: pre-line;
Tomasz Mularczyk
3
@Tomasz: Creo que no hay espacios en blanco o espacios en blanco: -Hoja de estilo para <Texto> -Tag en react-native - ¿o me equivoco?
suther
1
Los literales de plantilla son limpios y ordenados en comparación con la respuesta aceptada
Hemadri Dasari
Supongo que el estilo de espacio en blanco se supone que elimina los espacios de intendación, ¿verdad? Si es así, lo necesito desesperadamente, de lo contrario los literales de cadena se vuelven súper feos ...
Xerus
@ Xerus Puede usar un postprocesador de texto para eliminar la sangría, como se ve aquí: gist.github.com/Venryx/84cce3413b1f7ae75b3140dd128f944c
Venryx
34

Utilizar:

<Text>{`Hi,\nCurtis!`}</Text>

Resultado:

Hola,

Curtis!

COdek
fuente
2
Esto parece no funcionar cuando el mensaje es una variable de cadena: <Text> {message} </Text>
user2078023
Puede usar funciones como esta: splitLine = message => {...} y RegExp en él, luego <Text> {this.splitLine (mensaje)} </Text>
COdek
13

Esto funciono para mi

<Text>{`Hi~\nthis is a test message.`}</Text>

(reaccionar nativo 0.41.0)

Olivier
fuente
12

Si está mostrando datos de variables de estado, use esto.

<Text>{this.state.user.bio.replace('<br/>', '\n')}</Text>
Edison D'souza
fuente
9

Puedes usar {'\n'}como saltos de línea. Hola ~ {'\ n'} este es un mensaje de prueba.

Vijay Suryawanshi
fuente
4

Mejor aún: si lo usa styled-components, puede hacer algo como esto:

import React, { Component } from 'react';
import styled from 'styled-components';

const Text = styled.Text`
  text-align: left;
  font-size: 20px;
`;

export default class extends Component {

 (...)

 render(){
  return (
    <View>
      <Text>{`
        1. line 1
        2. line 2
        3. line 3
      `}</Text>
    </View>
  );
 }

}
Telmo Dias
fuente
1
Esto no tiene nada que ver con los componentes con estilo y funcionará sin importar si los usa o no.
Kuba Jagoda
3

Puedes intentar usarlo así

<text>{`${val}\n`}</text>
Pankaj Agarwal
fuente
2

Necesitaba una solución de una línea ramificada en un operador ternario para mantener mi código bien sangrado.

{foo ? `First line of text\nSecond line of text` : `Single line of text`}

El resaltado de sintaxis sublime ayuda a resaltar el carácter de salto de línea:

Sublime resaltado de sintaxis

Beau Smith
fuente
1

Puedes usar `` así:

<Text>{`Hi~
this is a test message.`}</Text>
Idan
fuente
1

Puedes hacerlo de la siguiente manera:

{'Crear \ nSu cuenta'}

Himanshu Ahuja
fuente
También funcionó desde aquí <Header headerText = {'Muhammad \ n Tayyab \ n Rana'} subHeadline = "Desarrollador y diseñador web" />
muhammad tayyab
1

También puede agregarlo como una constante en su método de renderizado para que sea fácil de reutilizar:

  render() {
    const br = `\n`;
     return (
        <Text>Capital Street{br}Cambridge{br}CB11 5XE{br}United Kingdom</Text>
     )  
  }
Tim J
fuente
1

Simplemente colóquelo {'\n'}dentro de la etiqueta de texto

<Text>

   Hello {'\n'}

   World!

</Text>
Hashini
fuente
1

Una de las formas más limpias y flexibles sería usar Template Literals .

Una ventaja de usar esto es que, si desea mostrar el contenido de la variable de cadena en el cuerpo del texto, es más limpio y directo.

(Tenga en cuenta el uso de caracteres de retroceso)

const customMessage = 'This is a test message';
<Text>
{`
  Hi~
  ${customMessage}
`}
</Text>

Resultaría en

Hi~
This is a test message
Akhil Balakrishnan
fuente
0

En caso de que alguien esté buscando una solución en la que desee tener una nueva línea para cada cadena en una matriz, puede hacer algo como esto:

import * as React from 'react';
import { Text, View} from 'react-native';


export default class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      description: ['Line 1', 'Line 2', 'Line 3'],
    };
  }

  render() {
    // Separate each string with a new line
    let description = this.state.description.join('\n\n');

    let descriptionElement = (
      <Text>{description}</Text>
    );

    return (
      <View style={{marginTop: 50}}>
        {descriptionElement}
      </View>
    );
  }
}

Vea la merienda para ver un ejemplo en vivo: https://snack.expo.io/@cmacdonnacha/react-native-new-break-line-example

ReturnOfTheMac
fuente
0

Simplemente use {"\ n"} donde quiera romper la línea

M.Hassam Yahya
fuente
0

Otra forma de insertar <br>entre líneas de texto que se definen en una matriz:

import react, { Fragment } from 'react';

const lines = [
  'One line',
  'Another line',
];

const textContent =
  lines.reduce(items, line, index) => {
    if (index > 0) {
      items.push(<br key={'br-'+index}/>);
    }
    items.push(<Fragment key={'item-'+index}>{line}</Fragment>);
    return items;
  }, []);

Entonces el texto puede usarse como variable:

<Text>{textContent}</Text>

Si no está disponible, Fragmentse puede definir de esta manera:

const Fragment = (props) => props.children;
Max Oriola
fuente
0

https://stackoverflow.com/a/44845810/10480776 La respuesta de @Edison D'souza fue exactamente lo que estaba buscando. Sin embargo, solo estaba reemplazando la primera aparición de la cadena. Aquí estaba mi solución para manejar múltiples <br/>etiquetas:

<Typography style={{ whiteSpace: "pre-line" }}>
    {shortDescription.split("<br/>").join("\n")}
</Typography>

Lo sentimos, no pude comentar sobre su publicación debido a la limitación de puntaje de reputación.

ilike2breakthngs
fuente
0

Aquí hay una solución para React (no React Native) usando TypeScript.

El mismo concepto se puede aplicar a React Native

import React from 'react';

type Props = {
  children: string;
  Wrapper?: any;
}

/**
 * Automatically break lines for text
 *
 * Avoids relying on <br /> for every line break
 *
 * @example
 * <Text>
 *   {`
 *     First line
 *
 *     Another line, which will respect line break
 *  `}
 * </Text>
 * @param props
 */
export const Text: React.FunctionComponent<Props> = (props) => {
  const { children, Wrapper = 'div' } = props;

  return (
    <Wrapper style={{ whiteSpace: 'pre-line' }}>
      {children}
    </Wrapper>
  );
};

export default Text;

Uso:

<Text>
  {`
    This page uses server side rendering (SSR)

    Each page refresh (either SSR or CSR) queries the GraphQL API and displays products below:
  `}
</Text>

Muestra: ingrese la descripción de la imagen aquí

Vadorequest
fuente
-3

Uso \nen texto y CSSwhite-space: pre-wrap;

Alexey Zavrin
fuente
1
No veo en la whiteSpacelista como React Native Text Style Prop . Tenga en cuenta que esto no es HTML.
binki
para referencia esto funciona en react js. Otros por alguna razón no funcionan para mí.
HimanshuArora9419