¿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.

Puedes usar \ndonde quieras romper la línea.
Sam009

Respuestas:


655

Esto debería hacerlo:

<Text>
Hi~{"\n"}
this is a test message.
</Text>

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.


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!


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)


12

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

<Text>{this.state.user.bio.replace('<br/>', '\n')}</Text>


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>
  );
 }

}

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


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


1

Puedes usar `` así:

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

1

Puedes hacerlo de la siguiente manera:

{'Crear \ nSu cuenta'}


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>
     )  
  }

1

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

<Text>

   Hello {'\n'}

   World!

</Text>

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

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



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;

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.


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í


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.