React에서 여러 줄 텍스트 문자열을 렌더링하는 방법


87

줄 바꿈이 포함 된 텍스트 문자열이 있고 다음과 같이 렌더링한다고 가정합니다.

render() {
    var text = "One\nTwo\nThree";
    return <div>{text}</div>;
}

HTML에서 줄 바꿈은 줄 바꿈으로 렌더링되지 않습니다. React에서 어떻게해야합니까? <br>태그 로 변환하고 dangerouslySetInnerHTML. 다른 방법이 있습니까?


사용했다면 <br>문제가 될 수 있습니다. <br/>HTML 4 버전 을 사용하지 않으면 JS Transformer가 좋아하지 않는다는 것을 알게되었습니다 .
steviesama

두 줄의 React 코드를 변수에 할당하려면 두 줄을 괄호로 묶습니다. ()
Vael Victus 2017

1
나는 사전 포장을 사용하여 이것을 고쳤습니다. 여기에 비슷한 질문에 대한 내 대답은 다음과 같습니다 stackoverflow.com/a/55466235/5346095
JS dev에

답변:


73

각 줄에 div를 넣어 볼 수 있습니다.

render() {
    return (<div>
        <div>{"One"}</div>
        <div>{"Two"}</div>
        <div>{"Three"}</div>
    </div>);
}

또는

render() {
    var text = "One\nTwo\nThree";
    return (
    <div>
        {text.split("\n").map((i,key) => {
            return <div key={key}>{i}</div>;
        })}
    </div>);
}

5
나는 이것을 좋아한다. 나는 <MultilineText>그것 으로 구성 요소를 만들 수도 있다고 생각합니다 !
Aaron Beall

13
<div>텍스트 행의 서식 을 지정하는 데 사용 하는 이유는 무엇 입니까? <p>의미 상 더 정확 해 보입니다.
kost

1
이것이 어떻게 처리 되어야 하는가? 나는 이것이 작동한다는 것을 알지만 이것은 마크 업에 엉망을 만듭니다. 사용자가이 텍스트를 복사하려면 어떻게해야합니까? 공정하게 말하면 여기서 결함은 솔루션이 아니라 반응 처리에 있습니다. 이것이 최선의 선택 일 수 있지만 와우.
kevincoleman

1
반응에 대해 생각하지 말고 HTML을 사용하여이를 처리 할 수있는 방법을 생각하십시오. 지금까지 가장 좋은 해결책은 div를 만들고 BR 태그 또는 블록 범위를 추가하는 것입니다. 제 생각에는 이것은 HTML / react에 대한 동일한 시나리오입니다.
Sergio Flores

245

새로운 CSS 클래스 만들기

.display-linebreak {
  white-space: pre-line;
}

해당 CSS 클래스로 텍스트 표시

render() {
  const text = 'One \n Two \n Three';
  return ( 
     <div className="display-linebreak"> 
        {text} 
     </div>
  );
}

줄 바꿈을 사용하여 렌더링합니다 (공백 시퀀스는 단일 공백으로 축소됩니다. 필요한 경우 텍스트가 줄 바꿈 됨). 이렇게 :

One
Two
Three

사전 포장을 고려할 수도 있습니다. 자세한 정보는 여기 ( CSS 공백 속성 ).


2
이것은 내가 받아 들인 대답에 대한 훌륭한 대안이며 찬성할만한 가치가 있지만 시도해 보았고 레이아웃 / 오버플로 / 렌더링에 문제가 있음을 언급해야한다고 생각합니다. 여백 옵션 중 어느 것도 그 당시 수정이 필요한 모든 경우에서 제대로 작동하지 않는 것처럼 보였지만 수락 된 대답은 그렇지 않았습니다.
아론 Beall

1
확실히 최고의 답변입니다. CSS를 추가하기 만하면지도 나 다른 것을 사용할 필요가 없습니다. 감사.
Frederiko Cesar

26

CSS 속성 "white-space : pre"를 사용할 수 있습니다. 나는 이것이 이것을 처리하는 가장 쉬운 방법이라고 생각합니다.


Best answer, imo : 이것은 디스플레이 문제이므로 이상적으로 CSS로 처리해야합니다 (html을 변경하지 않음)
Bogdan D

12
white-space:prewhite-space:nowrap저 와 같은 효과가있었습니다. 즉, 텍스트가 컨테이너를 넘쳤습니다. white-space:pre-wrap대신 사용하면 이것을 해결했습니다.
rorymorris89

"pre"만 사용하면 텍스트가 컨테이너를 초과하거나 포장하지 않습니다. white-space: pre-line;대신 사용하십시오 .
Frederiko Cesar

6

여기 가장 깨끗한 솔루션 (afaik) :

   render(){
      return <pre>
             Line 1{"\n"}
             Line 2{"\n"}
             Line 3{"\n"}
      </pre>
   }

대신 <div style={{whiteSpace:"pre"}}>, 또는 다른 html 블록 요소 (예 : span또는 p이 스타일 속성과 함께) 를 사용할 수도 있습니다 .


다양한 방법을 시도해 주셔서 감사합니다. 이것이 저에게 도움이 된 유일한 솔루션입니다.
Saurabh Rana

2

이걸로 해봐,

render() {
    var text = "One\nTwo\nThree";
    return <div style={{whiteSpace: 'pre-line'}}>{text}</div>;
}

0

구분 된 텍스트 "My line one \ nMy second line \ nWhatevs ..."를 일반 html 텍스트 영역 안에 렌더링합니다. 나는 오늘 그것을 사용했기 때문에 그것이 작동한다는 것을 안다! 필요한 경우 텍스트 영역을 읽기 전용으로 만들고 그에 따라 스타일을 지정하십시오.


0

-webkit-user-modify: read-write-plaintext-only;div에서 사용할 수 있습니다 . 예를 들어 \ n 및 \ p와 같은 것을 형식화하고 이해합니다.


0

html의 textarea 태그를 사용할 수 있으며 나중에 textarea 태그에 스타일을 추가 할 수 있습니다. 줄 바꿈 및 탭 공백을 포함한 모든 문제를 거의 해결합니다. 치어 즈 ...

예 : 렌더링은 다음과 같습니다.

render() {
    var text = "One\nTwo\nThree";
    return <textarea>{text}</textarea>;
}

산출:

One
Two
Three

0

String.raw이 유형의 값에 대해 대신 안전하게 실행할 수 있습니다 .

const text = String.raw`One
Two
Three
`
render() {
  return <div style={{ whiteSpace: "pre" }}>{text}</div>
}

또한 <pre>동일한 작업을 효과적으로 수행 하는 태그를 사용할 수도 있지만 이미 앱에서 다른 용도로 사용하고 있다면 의미 상 명확하지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.