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.