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.
Curtis
sumber
Anda dapat menggunakan di \nmana Anda ingin memutuskan garis.
Sam009

Jawaban:

655

Ini harus dilakukan:

<Text>
Hi~{"\n"}
this is a test message.
</Text>
Chris Ghenea
sumber
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.

Venryx
sumber
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!

COdek
sumber
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)

Olivier
sumber
12

Jika Anda menampilkan data dari variabel status, gunakan ini.

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

Anda dapat menggunakan {'\n'}sebagai jeda baris. Hai ~ {'\ n'} ini adalah pesan ujian.

Vijay Suryawanshi
sumber
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>
  );
 }

}
Telmo Dias
sumber
1
Ini tidak ada hubungannya dengan komponen yang ditata dan akan bekerja tidak masalah apakah Anda menggunakannya atau tidak.
Kuba Jagoda
3

Anda dapat mencoba menggunakan seperti ini

<text>{`${val}\n`}</text>
Pankaj Agarwal
sumber
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

Beau Smith
sumber
1

Anda dapat menggunakan `` seperti ini:

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

Anda dapat melakukannya sebagai berikut:

{'Buat \ n Akun Anda'}

Himanshu Ahuja
sumber
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>
     )  
  }
Tim J
sumber
1

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

<Text>

   Hello {'\n'}

   World!

</Text>
Hashini
sumber
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
Akhil Balakrishnan
sumber
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

ReturnOfTheMac
sumber
0

Cukup gunakan {"\ n"} di mana Anda ingin memutuskan garis

M.Hassam Yahya
sumber
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;
Max Oriola
sumber
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.

ilike2breakthngs
sumber
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

Vadorequest
sumber
-3

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

Alexey Zavrin
sumber
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