如何在React Native的<Text>组件中插入换行符?


336

我想在React Native的Text组件中插入新行(例如\ r \ n,<br />)。

如果我有:

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

您可以\n在想换行的地方使用。
Sam009

Answers:


654

应该这样做:

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

20
有没有办法从变量字符串做到这一点,所以我可以使用:<Text>{content}</Text>
Roman Sklenar

2
\ n是换行符
克里斯·格尼亚

8
谢谢你 我最终制作了一个可以快速访问的换行组件 var Br = React.createClass({ render() { return ( <Text> {"\n"}{"\n"} </Text> ) } })
Jonathan Lockley

4
如果文本在字符串变量中怎么办?<Text>{comments}</Text>我们不能在{\n}那里使用逻辑。那怎么办
user2078023

2
如果文字来自道具,请确保您这样传递:<Component text={"Line1\nLine2"} />而不是 <Component text="Line1\nLine2" />(注意添加的花括号)
qwertzguy

91

您也可以这样做:

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

我认为这很容易,因为您不必在字符串中插入内容。只需包装一次,即可保留所有换行符。


7
这是迄今为止最干净的解决方案,以及white-space: pre-line;
Tomasz Mularczyk

3
@Tomasz:我认为没有空格或whitespace:-react-native中<Text> -Tag的样式表-还是我错了?
suther

1
模板文字干净整洁,与接受的答案相比很简单
Hemadri Dasari

我猜空白样式应该删除意向空间,对吗?如果是的话,我非常需要它,否则字符串文字会变得非常丑陋……
Xerus

@Xerus您可以使用文本后处理程序删除缩进,如下所示:gist.github.com/Venryx/84cce3413b1f7ae75b3140dd128f944c
Venryx

34

采用:

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

结果:

你好

柯蒂斯!


2
当消息是字符串变量时,这似乎不起作用:<Text> {message} </ Text>
user2078023

您可以使用如下函数:splitLine = message => {...}并在其中添加RegExp,然后使用<Text> {this.splitLine(message)} </ Text>
COdek

13

这对我有用

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

(本机0.41.0)




4

更好的是:如果使用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>
  );
 }

}

这与样式化组件无关,无论您是否使用它们都将起作用。
库巴Jagoda


2

我需要在三元运算符中分支的单行解决方案,以使我的代码很好地缩进。

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

Sublime语法突出显示有助于突出显示换行符:

崇高语法高亮


1

您可以这样使用``:

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

1

您可以按照以下步骤进行操作:

{“创建\ n您的帐户”}


它的工作方式也如下:<Header headerText = {'Muhammad \ n Tayyab \ n Rana'} subHeadline =“ Web Developer and Designer” />
muhammad tayyab

1

您也可以将其作为常量添加到渲染方法中,以便易于重用:

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

1

只需放在{'\n'}Text标签内

<Text>

   Hello {'\n'}

   World!

</Text>

1

最干净,最灵活的方法之一就是使用Template Literals

使用此方法的一个好处是,如果要在文本正文中显示字符串变量的内容,它会更简洁明了。

(请注意反引号字符的用法)

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

会导致

Hi~
This is a test message

0

如果有人在寻找一种解决方案,而您想为数组中的每个字符串换行,则可以执行以下操作:

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



0

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

0

https://stackoverflow.com/a/44845810/10480776 @Edison D'souza的答案正是我想要的。但是,它只是替换字符串的第一次出现。这是我处理多个<br/>标签的解决方案:

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

抱歉,由于声誉得分的限制,我无法评论他的帖子。


0

这是使用TypeScript的React(不是React Native)解决方案。

相同的概念可以应用于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>

显示: 在此处输入图片说明


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.