React改行表示解決法
問題
Reactでテキストエリアに入力した内容を保存し、表示する際に、改行がそのまま反映されないことがあります。これは、テキストエリアで入力された改行が、ブラウザによって \n
(改行コード) として扱われるためです。Reactはデフォルトでは \n
を単なる空白として扱ってしまうため、改行が反映されません。
解決方法
CSSによる解決
.text-area-content {
white-space: pre-wrap;
word-wrap: break-word;
}
word-wrap: break-word
: 長い単語を折り返し表示します。white-space: pre-wrap
: 空白文字をそのまま表示し、改行コードで改行します。
JavaScriptによる解決
import React from 'react';
function MyComponent() {
const [text, setText] = useState('ここにテキストが入ります\n改行が入ります');
return (
<div className="text-area-content">{text.split('\n').map((line, index) => (
<p key={index}>{line}</p>
))}</div>
);
}
key
プロップを指定して、Reactが要素を効率的にレンダリングできるようにします。- テキストを
\n
で分割し、各行を<p>
タグで囲みます。
どちらの方法でも、テキストエリアに入力された改行を正しく表示することができます。
- より複雑なテキストフォーマットが必要な場合は、MarkdownやHTMLなどのマークアップ言語を使用することも検討できます。
- テキストエリアの値をサーバーに送信する場合は、
\n
がそのまま送信されるので、サーバー側で適切に処理する必要があります。
.text-area-content {
white-space: pre-wrap;
word-wrap: break-word;
}
import React, { useState } from 'react';
function MyComponent() {
const [text, setText] = useState('ここにテキストが入ります\n改行が入ります');
return (
<div className="text-area-content">
{text.split('\n').map((line, index) => (
<p key={index}>{line}</p>
))}
</div>
);
}
key={index}
: Reactが要素を効率的にレンダリングするために必要なプロパティです。.map()
: 配列の各要素に対して、<p>
タグで囲んで新しい配列を作成します。text.split('\n')
: テキストを\n
で分割して、各行を配列に格納します。
この方法は、HTMLを直接レンダリングするため、セキュリティリスクがあるため、慎重に使用してください。
import React, { useState } from 'react';
function MyComponent() {
const [text, setText] = useState('ここにテキストが入ります\n改行が入ります');
return (
<div dangerouslySetInnerHTML={{ __html: text }} />
);
}
ライブラリの利用
- react-syntax-highlighter
コードハイライト機能を提供し、改行を適切に表示できます。 - react-markdown
Markdown形式のテキストをHTMLに変換して表示できます。
注意
- ライブラリを使用する場合は、そのライブラリの使用方法とセキュリティ上の考慮事項を理解する必要があります。
dangerouslySetInnerHTML
は、信頼できないソースからの入力を使用する場合、XSS攻撃のリスクがあります。
javascript reactjs textarea