Bagaimana saya bisa memasukkan pemecah baris ke komponen <Text> di React Native?


336

Saya ingin menyisipkan baris baru (seperti \ r \ n, <br />) dalam komponen teks di React Native.

Jika saya punya:

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

Kemudian React Native renders Hi~ this is a test message.

Apakah mungkin membuat teks untuk menambahkan baris baru seperti:

Hi~
this is a test message.

Anda dapat menggunakan di \nmana Anda ingin memutuskan garis.
— Sam009

Jawaban:


655

Ini harus dilakukan:

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

21
Apakah ada cara untuk melakukannya dengan string dari variabel sehingga saya bisa menggunakan <Text>{content}</Text>:?
— Roman Sklenar

2
\ n adalah break baris
— Chris Ghenea

8
Terima kasih untuk ini. Saya akhirnya membuat komponen line break untuk akses cepat var Br = React.createClass({ render() { return ( <Text> {"\n"}{"\n"} </Text> ) } })
— Jonathan Lockley

4
Bagaimana jika teks dalam variabel string? <Text>{comments}</Text>Kita tidak bisa menggunakan {\n}logika di sana. Lalu bagaimana?
— user2078023

2
Jika teksnya berasal dari prop, pastikan Anda memberikannya seperti ini: <Component text={"Line1\nLine2"} />alih-alih <Component text="Line1\nLine2" />(perhatikan kurung kurawal yang ditambahkan)
— qwertzguy

92

Anda juga dapat melakukan:

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

Lebih mudah menurut saya, karena Anda tidak harus memasukkan barang ke dalam string; hanya membungkusnya sekali dan itu membuat semua jeda Anda.


7
ini adalah solusi terbersih sejauh ini, bersama denganwhite-space: pre-line;
— Tomasz Mularczyk

3
@ Thomasz: Saya pikir tidak ada white-space atau whiteSpace: -Stylesheet untuk <Text> -Tag di reaksi-asli - atau saya salah?
— suther

1
Templat literal bersih dan rapi dibandingkan dengan jawaban yang diterima
— Hemadri Dasari

Saya kira gaya ruang-putih seharusnya menghapus ruang niat, kan? Jika ya, saya sangat membutuhkannya, jika tidak string literal menjadi sangat jelek ...
— Xerus

@Xerus Anda dapat menggunakan prosesor pasca-teks untuk menghapus lekukan, seperti yang terlihat di sini: gist.github.com/Venryx/84cce3413b1f7ae75b3140dd128f944c
— Venryx

34

Menggunakan:

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

Hasil:

Hai,

Curtis!


2
Ini sepertinya tidak berfungsi ketika pesannya adalah variabel string: <Text> {message} </Text>
— user2078023

Anda dapat menggunakan fungsi seperti ini: splitLine = message => {...} dan RegExp di dalamnya, lalu <Text> {this.splitLine (message)} </Text>
— COdek

13

Ini berhasil untuk saya

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

(reaksi asli 0.41.0)


12

Jika Anda menampilkan data dari variabel status, gunakan ini.

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


4

Lebih baik lagi: jika Anda menggunakan styled-components, Anda dapat melakukan sesuatu seperti ini:

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
Ini tidak ada hubungannya dengan komponen yang ditata dan akan bekerja tidak masalah apakah Anda menggunakannya atau tidak.
— Kuba Jagoda


2

Saya membutuhkan solusi satu baris yang bercabang di operator ternary untuk menjaga kode saya terindentasi dengan baik.

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

Penyorotan sintaks yang luhur membantu menyoroti karakter line-break:

Sorot sintaks yang luhur


1

Anda dapat menggunakan `` seperti ini:

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

1

Anda dapat melakukannya sebagai berikut:

{'Buat \ n Akun Anda'}


Ini juga bekerja dengan baik di sini <Header headerText = {'Muhammad \ n Tayyab \ n Rana'} subHeadline = "Pengembang dan Perancang Web" />
— muhammad tayyab

1

Anda juga bisa menambahkannya sebagai konstanta dalam metode render Anda sehingga mudah digunakan kembali:

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

1

Masukkan saja ke {'\n'}dalam tag Teks

<Text>

   Hello {'\n'}

   World!

</Text>

1

Salah satu cara paling bersih dan paling fleksibel adalah menggunakan Templat Literal .

Keuntungan menggunakan ini adalah, jika Anda ingin menampilkan konten variabel string di badan teks, itu lebih bersih dan lurus ke depan.

(Harap perhatikan penggunaan karakter backtick)

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

Akan menghasilkan

Hi~
This is a test message

0

Jika ada yang mencari solusi di mana Anda ingin memiliki baris baru untuk setiap string dalam array Anda bisa melakukan sesuatu seperti ini:

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

Lihat camilan untuk contoh langsung: https://snack.expo.io/@cmacdonnacha/react-native-new-break-line-example



0

Cara lain untuk menyisipkan <br>antara baris teks yang didefinisikan dalam array:

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;
  }, []);

Kemudian teks dapat digunakan sebagai variabel:

<Text>{textContent}</Text>

Jika tidak tersedia, Fragmentdapat didefinisikan dengan cara ini:

const Fragment = (props) => props.children;

0

https://stackoverflow.com/a/44845810/10480776 @Edison D'souza jawaban persis apa yang saya cari. Namun, itu hanya menggantikan kemunculan pertama string. Inilah solusi saya untuk menangani beberapa <br/>tag:

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

Maaf, saya tidak dapat mengomentari posnya karena batasan skor reputasi.


0

Berikut adalah solusi untuk Bereaksi (bukan Bereaksi Asli) menggunakan TypeScript.

Konsep yang sama dapat diterapkan untuk Bereaksi Asli

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;

Pemakaian:

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

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

Menampilkan: masukkan deskripsi gambar di sini


-3

Gunakan \ndalam teks dan csswhite-space: pre-wrap;


1
Saya tidak melihat whiteSpaceterdaftar sebagai Prop Gaya Teks Asli Bereaksi . Perhatikan bahwa ini bukan HTML.
— binki

untuk referensi ini berfungsi dalam reaksi js. Orang lain karena suatu alasan tidak bekerja untuk saya.
— HimanshuArora9419
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.