Reactで複数行のテキスト文字列をレンダリングする方法


83

改行を含むテキスト文字列があり、次のようにレンダリングするとします。

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

HTMLでは、改行は改行として表示されません。Reactでこれをどのように行う必要がありますか?<br>タグに変換して使用したくありませんdangerouslySetInnerHTML。別の方法はありますか?


使用<br>した場合、それが問題になる可能性があります。<br/>HTML 4バージョンを使用しない限り、JSTransformerはそれを気に入らないことに気づきました。
steviesama 2017年

Reactコードの2行を変数に割り当てるには、両方の行を括弧で囲みます。()
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>もそれからコンポーネントを作ることができると思います!
アーロンビール2016

13
なぜ<div>テキスト行のフォーマットに使用するのですか?<p>より意味的に正しいようです。
kost 2017年

1
これは真剣にこれをどのように扱うべきですか?これは機能するようですが、これによりマークアップが混乱します。ユーザーがこのテキストをコピーしたい場合はどうなりますか?公平を期すために、ここでの欠点は、ソリューションではなく、reactの処理にあります。これが最良の選択肢かもしれませんが、すごいです。
kevincoleman

1
反応について考えるのではなく、HTMLを使用してこれをどのように処理できるかを考えてください。最善の解決策は、divを作成するか、BRタグを配置するか、スパンをブロックすることです。私の意見では、これはHTML / reactの場合と同じシナリオです。
セルジオフローレス

236

新しい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
これは私が受け入れた答えの素晴らしい代替案であり、賛成に値しますが、私はそれを試し、レイアウト/オーバーフロー/レンダリングに問題があったことを言及する必要があると感じています。受け入れられた答えは機能しましたが、その時点で修正が必要なすべてのケースで、空白のオプションはどれも正しく機能していないようでした。
アーロンビール2017年

確かに最良の答え。CSSを追加するだけで、マップなどを使用する必要はありません。ありがとう。
セザール

26

CSSプロパティ「white-space:pre」を使用できます。これがこれを処理する最も簡単な方法だと思います。


ベストアンサー、imo:これは表示の問題なので、理想的にはcssで処理する必要があります(htmlを変更することではありません)
Bogdan D

12
white-space:prewhite-space:nowrap私と同じ効果がありました。つまり、テキストがコンテナからオーバーフローしました。white-space:pre-wrap代わりに使用してこれを解決しました。
rorymorris89 2017年

「pre」のみを使用すると、テキストがコンテナを超えたり、折り返されなかったりします。white-space: pre-line;代わりに使用してください。
セザール

6

ここで最もクリーンなソリューション(afaik):

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

代わりに使うこともでき<div style={{whiteSpace:"pre"}}>、または(のような任意の他のHTMLブロック要素spanまたはpこのスタイル属性を持ちます)


さまざまな方法を試した後、これが私のために働いた唯一の解決策です。
Saurabh Rana

0

区切られたテキスト「Mylineone \ nMy second line \ nWhatevs ...」を通常のhtmlテキストエリア内にレンダリングします。今日使ったばかりなのでうまくいくと思います!必要に応じてtextareaをreadOnlyにし、それに応じてスタイルを設定します。


0

あなたは-webkit-user-modify: read-write-plaintext-only;あなたのdivで使うことができます。たとえば、\ nや\ pなどをフォーマットして理解します。


0

htmlのtextareaタグを利用でき、後でtextareaタグにスタイルを追加できます。改行やタブスペースなど、すべての問題をほぼ解決します。Cheerzz..。

例:レンダリングは次のようになります

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

出力:

One
Two
Three

0

これを試してみてください

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

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.