ฉันจะแทรกตัวแบ่งบรรทัดลงในคอมโพเนนต์ <Text> ใน React Native ได้อย่างไร


336

ฉันต้องการที่จะแทรกบรรทัดใหม่ (เช่น \ r \ n, <br />) ในองค์ประกอบข้อความใน React Native

ถ้าฉันมี:

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

จากนั้นตอบสนองการแสดงผลพื้นเมือง Hi~ this is a test message.

เป็นไปได้ไหมที่จะแสดงข้อความเพื่อเพิ่มบรรทัดใหม่เช่น:

Hi~
this is a test message.

คุณสามารถใช้\nตำแหน่งที่คุณต้องการแบ่งบรรทัด
Sam009

คำตอบ:


654

สิ่งนี้ควรทำ:

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

20
มีวิธีทำกับสตริงจากตัวแปรดังนั้นฉันสามารถใช้: <Text>{content}</Text>?
Roman Sklenar

2
\ n เป็นตัวแบ่งบรรทัด
Chris Ghenea

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
@ โทมัส: ฉันคิดว่าไม่มีพื้นที่สีขาวหรือพื้นที่สีขาว: -Stylesheet สำหรับ <Text> - แท็กในการตอบสนองพื้นเมือง - หรือฉันผิด
suther

1
เทมเพลตตัวอักษรนั้นสะอาดและเรียบร้อยเมื่อเปรียบเทียบกับคำตอบที่ได้รับการยอมรับ
Hemadri Dasari

ฉันเดาว่าสไตล์พื้นที่สีขาวควรจะลบช่องว่างที่ต้องการใช่ไหม ถ้าใช่ผมหมดท่าต้องมันมิฉะนั้นจะได้รับตัวอักษรของสตริงสุดน่าเกลียด ...
Xerus

@ Xerus คุณสามารถใช้ตัวประมวลผลข้อความเพื่อลบการเยื้องตามที่เห็นที่นี่: gist.github.com/Venryx/84cce3413b1f7ae75b3140dd128f944c
Venryx

34

ใช้:

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

ผลลัพธ์:

สวัสดี

เคอร์ติ!


2
ดูเหมือนว่าจะไม่ทำงานเมื่อข้อความเป็นตัวแปรสตริง: <Text> {ข้อความ} </Text>
2078023

คุณสามารถใช้ฟังก์ชันดังนี้: splitLine = message => {... } และ RegExp ในนั้นจากนั้น <Text> {this.splitLine (ข้อความ)} </Text>
COdek


12

หากคุณกำลังแสดงข้อมูลจากตัวแปรสถานะให้ใช้สิ่งนี้

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


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

}

1
สิ่งนี้ไม่เกี่ยวกับองค์ประกอบที่มีสไตล์และจะทำงานได้ไม่ว่าคุณจะใช้มันหรือไม่ก็ตาม
Kuba Jagoda


2

ฉันต้องการวิธีแก้ปัญหาแบบบรรทัดเดียวในผู้ประกอบการที่ประกอบไปด้วยสามส่วนเพื่อให้รหัสของฉันเยื้องอย่างดี

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

การเน้นไวยากรณ์แบบประเสริฐช่วยให้ไฮไลต์อักขระตัวแบ่งบรรทัด:

ไฮไลต์ไวยากรณ์ที่ประเสริฐ



1

คุณสามารถทำได้ดังนี้

{'สร้าง \ n บัญชีของคุณ'}


มันทำงานในรูปแบบที่นี่ด้วย <Header headerText = {'Muhammad \ n Tayyab \ n Rana'} subHeadline = "นักพัฒนาเว็บและผู้ออกแบบ" />
muhammad tayyab

1

คุณยังสามารถเพิ่มเป็นค่าคงที่ในวิธีการเรนเดอร์ของคุณเพื่อนำมาใช้ใหม่ได้ง่าย:

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


1

หนึ่งในวิธีที่สะอาดและยืดหยุ่นที่สุดคือการใช้เทมเพลตตัวอักษรแม่แบบตัวอักษร

ข้อได้เปรียบของการใช้สิ่งนี้คือถ้าคุณต้องการแสดงเนื้อหาของตัวแปรสตริงในเนื้อหาข้อความมันจะสะอาดและตรงไปตรงมา

(โปรดทราบการใช้อักขระ backtick)

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

นี่คือโซลูชันสำหรับ 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>

แสดง: ป้อนคำอธิบายรูปภาพที่นี่


-3

ใช้\nในข้อความและ csswhite-space: pre-wrap;


1
ฉันไม่เห็นwhiteSpaceระบุว่าเป็นปฏิกิริยาพื้นเมืองข้อความสไตล์ Prop โปรดทราบว่านี่ไม่ใช่ HTML
binki

สำหรับการอ้างอิงงานนี้ใน react js คนอื่นด้วยเหตุผลบางอย่างไม่ทำงานสำหรับฉัน
HimanshuArora9419
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.