Как я могу вставить разрыв строки в компонент ‹Text› в React Native?

Я хочу вставить новую строку (например, \ r \ n, ‹br /›) в текстовый компонент в React Native.

Если у меня есть:

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

Затем React Native отображает Hi~ this is a test message.

Можно ли отобразить текст, чтобы добавить новую строку следующим образом:

Hi~
this is a test message.

person Curtis    schedule 09.09.2015    source источник
comment
Вы можете использовать \n там, где хотите разорвать линию.   -  person Sid009    schedule 01.02.2020
comment
нет \ n не пойдет. я использовал. Я бы посоветовал использовать HTML-теги для рендеринга и использовать CSS или просто ‹p› текст ‹/p›. вы можете использовать.   -  person pankaj kumar    schedule 16.03.2021


Ответы (33)


Это должно сделать это:

<Text>
Hi~{"\n"}
this is a test message.
</Text>
person Chris Ghenea    schedule 09.09.2015
comment
Есть ли способ сделать это со строкой из переменной, чтобы я мог использовать: <Text>{content}</Text>? - person Roman Sklenar; 29.03.2016
comment
\ n - это разрыв строки - person Chris Ghenea; 30.03.2016
comment
Спасибо за это. В итоге я сделал компонент разрыва строки для быстрого доступа var Br = React.createClass({ render() { return ( <Text> {"\n"}{"\n"} </Text> ) } }) - person Jonathan Lockley; 15.07.2016
comment
Это закончилось тем, что строка разбила весь мой экран (все компоненты на одном уровне). : S - person Magne; 08.03.2018
comment
Разве нет такого тега, как ‹br›? Что, если мы хотим сделать разрыв строки ч / б двумя тегами? - person Pratik Singhal; 09.04.2018
comment
есть ли что-нибудь, чтобы сделать перевод строки на основе текста без счета? - person Anuj; 24.08.2018
comment
Что делать, если текст находится в строковой переменной? <Text>{comments}</Text> Мы не можем использовать здесь {\n} логику. Тогда как? - person user2078023; 14.01.2019
comment
Если текст взят из опоры, убедитесь, что вы передали его следующим образом: <Component text={"Line1\nLine2"} /> вместо <Component text="Line1\nLine2" /> (обратите внимание на добавленные фигурные скобки) - person qwertzguy; 16.02.2020
comment
Использование переменной внутри <Text>{content}</Text> с символом новой строки будет работать нормально. Если это не работает, это связано с \\n, поскольку символ новой строки экранирован дополнительным \. В этом случае используйте <Text>{content.replace(/[^\]\\n/g, '\n')}</Text>. - person Shreyak Upadhyay; 27.07.2020
comment
Ни одно из предложений на этой странице не помогло мне. Но я нашел кое-что, что работало в другом месте: forum.freecodecamp.org/ t / newline-in-react-string -olved / 68484 (в основном вставка символа (например, '\ n') в строку, а затем в компонент визуализации, разбиение строки на каждый символ и сопоставление подстрок ) - person mehrlicht; 29.05.2021

Вы также можете:

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

На мой взгляд, это проще, потому что вам не нужно вставлять что-то в строку; просто оберните его один раз, и он сохранит все ваши разрывы строк.

person Venryx    schedule 21.11.2016
comment
это самое чистое решение вместе с white-space: pre-line; - person Tomasz Mularczyk; 19.05.2017
comment
@Tomasz: Я думаю, что нет пробелов или пробелов: -Stylesheet для ‹Text› -Tag в react-native - или я ошибаюсь? - person suther; 03.08.2017
comment
Литералы шаблонов чистые и аккуратные по сравнению с принятым ответом - person Hemadri Dasari; 10.10.2018
comment
Я предполагаю, что стиль белого пространства должен убрать пробелы между намерениями, верно? Если да, то мне это очень нужно, иначе строковые литералы станут супер уродливыми ... - person Xerus; 24.10.2018
comment
@Xerus Вы можете просто использовать текстовый постпроцессор, чтобы удалить отступ, как показано здесь: gist.github. ru / Venryx / 84cce3413b1f7ae75b3140dd128f944c - person Venryx; 05.09.2019
comment
Отлично подходит для текста. Однако вы не можете стилизовать отдельные слова. - person Rocky Kev; 20.11.2019
comment
На данный момент это самое чистое решение, но для сохранения правильного отступа требуется white-space: pre-wrap;, а не white-space: pre-line;. - person Vincent Lecrubier; 30.06.2021

Использовать:

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

Результат:

Hi,

Кертис!

person COdek    schedule 17.05.2018
comment
Кажется, это не работает, если сообщение представляет собой строковую переменную: ‹Text› {message} ‹/Text› - person user2078023; 14.01.2019
comment
Вы можете использовать такую ​​функцию: splitLine = message = ›{...} и в ней RegExp, затем ‹Text› {this.splitLine (message)} ‹/Text› - person COdek; 02.02.2019

Если вы вообще отображаете данные из переменных состояния, используйте это.

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

Это сработало для меня

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

(реагировать-родной 0.41.0)

person Olivier    schedule 13.02.2017

Вы можете использовать {'\n'} как разрывы строк. Привет ~ {'\ n'}, это тестовое сообщение.

person Vijay Suryawanshi    schedule 17.11.2017

Еще лучше: если вы используете styled-components, вы можете сделать что-то вроде этого:

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

}
person Telmo Dias    schedule 28.11.2018
comment
Это не имеет ничего общего со стилями-компонентами и будет работать независимо от того, используете вы их или нет. - person Kuba Jagoda; 19.05.2020

Мне нужно было однострочное решение с разветвлением в тернарном операторе, чтобы мой код оставался с хорошим отступом.

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

Превосходная подсветка синтаксиса помогает выделить символ разрыва строки:

Превосходная подсветка синтаксиса

person Beau Smith    schedule 31.03.2017

Есть два варианта:

Вариант 1. Использование шаблонных литералов.

const Message = 'This is a message';

<Text>
{`
  Hi~
  ${Message}
`}
</Text>

Результат:

Hi~
This is a message

Вариант 2: Используйте {'\ n'} в качестве разрыва строки.

<Text>

   Hello {'\n'}

   World!

</Text>

Результат:

Hello
World!
person Biplov Kumar    schedule 10.10.2020

Вы можете попробовать вот так

<text>{`${val}\n`}</text>
person Pankaj Agarwal    schedule 29.08.2018

Простые обратные кавычки (функция ES 6)

РЕШЕНИЕ 1

const Message = 'This is a message';

<Text>
{`
  Hi~
  ${Message}
`}
</Text>

РЕШЕНИЕ 2 Добавьте \ n в текст

<Text>
Hi~{"\n"}
This is a message.
</Text>
person Community    schedule 11.10.2020

Вы можете использовать `` вот так:

<Text>{`Hi~
this is a test message.`}</Text>
person Idan    schedule 06.12.2018

Сделать это можно следующим образом:

{'Create \ nYour Account'}

person Himanshu Ahuja    schedule 14.03.2019
comment
Здесь тоже работает форма ‹Header headerText = {'Muhammad \ n Tayyab \ n Rana'} subHeadline = Web Developer and Designer /› - person muhammad tayyab; 22.03.2019

Вы также можете просто добавить его как константу в свой метод рендеринга, чтобы его было легко использовать повторно:

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

Просто поместите {'\n'} в текстовый тег

<Text>

   Hello {'\n'}

   World!

</Text>
person Curious96    schedule 16.11.2019


https://stackoverflow.com/a/44845810/10480776 Ответ @Edison D'souza был именно тем, что я искал . Однако он заменял только первое вхождение строки. Вот мое решение для обработки нескольких тегов <br/>:

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

Извините, я не смог прокомментировать его сообщение из-за ограничения оценки репутации.

person ilike2breakthngs    schedule 03.05.2020

Вот решение для React (не React Native) с использованием TypeScript.

Та же концепция может быть применена к 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;

Использование:

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

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

Отображает:  введите здесь описание изображения

person Vadorequest    schedule 06.05.2020

сделай это:

<Text>

 { "Hi~ \n this is a test message." }

<Text/>

person Mahdi Eslami    schedule 29.12.2020

это хороший вопрос, вы можете сделать это несколькими способами: Первый

<View>
    <Text>
        Hi this is first line  {\n}  hi this is second line 
    </Text>
</View>

что означает, что вы можете использовать {\ n} обратную косую черту n для разрыва строки

Второй

<View>
     <Text>
         Hi this is first line
     </Text>
     <View>
         <Text>
             hi this is second line 
         </Text>
     </View>
</View>

это означает, что вы можете использовать другой компонент ‹View› внутри первого ‹View› и обернуть его вокруг ‹Text› компонента

Счастливое кодирование

person Shahmir Khan    schedule 29.12.2020

Если вы получаете данные из state variable or props, компонент Text имеет свойство стиля с minWidth, maxWidth.

пример

const {height,width} = Dimensions.get('screen');

const string = `This is the description coming from the state variable, It may long thank this` 

<Text style={{ maxWidth:width/2}}>{string}</Text>

Это отобразит текст на 50% ширины вашего экрана.

person abduljeleelng    schedule 03.02.2021

Просто используйте {"\ n"} там, где хотите разорвать линию

person M.Hassam Yahya    schedule 06.09.2019

Если кто-то ищет решение, в котором вы хотите иметь новую строку для каждой строки в массиве, вы можете сделать что-то вроде этого:

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

См. Живой пример закуски: https://snack.expo.io/@cmacdonnacha/react-native-new-break-line-example

person ReturnOfTheMac    schedule 15.05.2019

Другой способ вставить <br> между текстовыми строками, которые определены в массиве:

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

Тогда текст можно использовать как переменную:

<Text>{textContent}</Text>

Если недоступно, Fragment можно определить следующим образом:

const Fragment = (props) => props.children;
person Max Oriola    schedule 26.02.2020

Этот код работает в моей среде. (реагировать-родной 0.63.4)

const charChangeLine = `
`
// const charChangeLine = "\n" // or it is ok

const textWithChangeLine = "abc\ndef"

<Text>{textWithChangeLine.replace('¥n', charChangeLine)}</Text>

Результат

abc
def
person asukiaaa    schedule 08.02.2021

иногда я пишу так:

<Text>
  You have {" "}
  {remaining}$ {" "}
  from{" "}
  {total}$
<Text>

(как мне кажется более понятным)

person mrxrinc    schedule 09.04.2021

2021 год, это работает для значения состояния REACT (вы должны добавить пустые блоки div, как и оператор возврата)

this.setState({form: (<> line 1 <br /> line 2 </>) })

person Rishi Bhachu    schedule 11.06.2021

Зачем так много работать? это 2020 год, создайте компонент для решения таких проблем

    export class AppTextMultiLine extends React.PureComponent {
    render() {
    const textArray = this.props.value.split('\n');
return (
        <View>
            {textArray.map((value) => {
               return <AppText>{value}</AppText>;
            })}
        </View>
    )
}}
person user3086644    schedule 21.09.2020
comment
Накладные расходы, просто используйте литералы шаблонов - person Vasyl Nahuliak; 19.02.2021

React не понравится, если вы поместите HTML <br /> туда, где он ожидает текст, а \ns не всегда отображаются, кроме как в теге <pre>.

Возможно, заключите каждую строку (абзац) с разрывом строки в тег <p> следующим образом:

{text.split("\n").map((line, idx) => <p key={idx}>{line}</p>)}

Не забывайте key, если вы повторяете компоненты React.

person errkk    schedule 07.12.2020

Я использовал p Tag для новой строки. поэтому здесь я вставил код, который поможет любому.

const new2DArr =  associativeArr.map((crntVal )=>{
          return <p > Id :  {crntVal.id} City Name : {crntVal.cityName} </p>;
     });
person pankaj kumar    schedule 16.03.2021

Используйте \n в тексте и css white-space: pre-wrap;

person Alexey Zavrin    schedule 24.07.2018
comment
Я не вижу whiteSpace в списке React Native Text Style Prop. Обратите внимание, что это не HTML. - person binki; 03.09.2018
comment
для справки это работает в react js. Остальные у меня почему-то не работают. - person HimanshuArora9419; 07.04.2020

Эй, просто поставь их вот так, у меня работает!

   <div>
       <p style={{ fontWeight: "bold", whitespace: "pre-wrap" }}>
         {" "}
         Hello {"\n"}
       </p>
         {"\n"}
       <p>I am here</p>
   </div>
person Farbod Aprin    schedule 02.03.2021

person    schedule
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа. - person Donald Duck; 01.07.2020
comment
\ n означает новую строку. - person Iresha Amarasinghe; 02.07.2020