APIからエラーの時、改行コード付きの文字列が返ってくるので、改行を <br> に変換して出力したかったのメモ
例えばこんな文字列を改行させて表示させたい
const msg = "星宮いちご\n霧矢あおい\n紫吹蘭";
タグが入っていても文字列は文字列として出力される
改行コードを <br> に変換するのは /\n/g や /\r\n|\n/g とかで replace すれば OK APIから返ってくるようなデータなら /\n/g で良さそうな気がする
str.replace で変換したものを children として出力しようとしても文字列なので文字列として出力される
// const msg = "星宮いちご\n霧矢あおい\n紫吹蘭"; const component = ({ msg }) => { const text = msg.replace(/\n/g, '<br />'); return <div>{text}</div>; }
👉 星宮いちご<br />霧矢あおい<br />紫吹蘭 という文字列が出力される
<div dangerouslySetInnerHTML={{__html: text}} /> で HTML タグを出力できるけど、あまり使いたくない方法なので別の方法にしたい。
<br /> タグを JSX で認識できる形にしなければならない
JSX は配列が扱えるので、改行コードで分割して直接 JSX な要素を作ってしまえばOK
// const msg = "星宮いちご\n霧矢あおい\n紫吹蘭"; const component = ({ msg }) => { const texts = msg.split("\n").map((item, index) => { // <></> は key を設定できないので、<React.Fragment /> を使う return ( <React.Fragment key={index}>{item}<br /></React.Fragment> ); }); return <div>{texts}</div>; }
👇
<div> 星宮いちご<br /> 霧矢あおい<br /> 紫吹蘭<br /> </div>
<br /> タグが入り改行はできているが、最後の要素に不要な改行タグが付いてしまう。
/n (改行コード) だけを <br /> に変換する
str.split はキャプチャが使えるようなのでこれを利用する
RegExpで分割して結果に区切り文字列の一部を含める
separatorがキャプチャの括弧()を含む正規表現である場合、一致した結果が配列に含まれます。
cf. String.prototype.split() - JavaScript | MDN
つまり
const msg = "星宮いちご\n霧矢あおい\n紫吹蘭"; msg.split(/(\n)/); // => ["星宮いちご", "↵", "霧矢あおい", "↵", "紫吹蘭"]
改行コードも配列の1要素になるので、この配列をループで回して改行コードなら <br /> タグに変換すれば良い。
// const msg = "星宮いちご\n霧矢あおい\n紫吹蘭"; const component = ({ msg }) => { const texts = msg.split(/(\n)/).map((item, index) => { return ( <React.Fragment key={index}> { item.match(/\n/) ? <br /> : item } </React.Fragment> ); }); return <div>{texts}</div>; }
👇
<div> 星宮いちご <br /> 霧矢あおい <br /> 紫吹蘭 </div>
改行タグは React.createElement('br') でも作れる。
全部に Fragment が入ってチョット壮大すぎる気もするけど
₍ ᐢ. ̫ .ᐢ ₎👌 ヨシ!!
SAMPLE
See the Pen JSX: display <br /> by strings by KIKIKI (@kikiki_kiki) on CodePen.

現場は安全っていったじゃないですか!~仕事猫&電話猫カードゲーム~
- メディア: おもちゃ&ホビー
