神戸学院大学 経営学部 林坂ゼミ

React 入門トップページ

« 戻る 次へ »

React 入門

TypeScript コメント掲示板アプリの開発

HTML タグのエスケープ処理

API のデータベースに登録したサンプルデータでは,id=3 のコメントに HTML のタグが含まれています.React アプリケーションに限らず Web アプリケーションで HTML のタグ(特にスクリプトなど)をそのまま実行することは非常に危険です.

% curl http://127.0.0.1:8000/comments/3/ ⏎
{
  "id":3,
  "title":"<3個目>のコメント",
  "body":"<h1>コメントの本文3</h1>",
  "updated_at":"2023-11-21T11:03:00"
}

しかしながら,JSX ではタグ文字が自動的にエスケープされるので,安心して利用できます.図の通り,タグが単なる文字列として表示されています.

ts-2024-40

データベースから取得した内容をタグとしてそのまま処理する場合は次のようにします.

<div dangerouslySetInnerHTML={{ __html: props.comment.body }} />

Comment コンポーネント全体を示します.

src/components/Comment.tsximport React from 'react'

interface CommentProps {
  comment: {
    id: number;
    title: string;
    body: string;
    updated_at: string;
  };
  onDelete: (id: number) => void;
}

const Comment: React.FC<CommentProps> = (props) => {

  const handleClickDeleteButton = () => {
    props.onDelete(props.comment.id);
  };

  return (
    <article>
      <div className="title">
        {props.comment.title}
      </div>
      <div className="body">
        {/* {props.comment.body} */}
        <div dangerouslySetInnerHTML={{ __html: props.comment.body }} />
      </div>
      <div className="deleteButton">
        <button
          onClick={handleClickDeleteButton}
        >
          削除
        </button>
      </div>
    </article>
  )
}

export default Comment

なお,JSX で処理をコメントアウトするには10行目のように {/* ... */} で囲います.しかし,複数あるコメントアウトのルールをすべて覚えるのは大変です.Visual Studio Code のショートカットキー Ctrl + / を使ってコメントアウトをすると Visual Studio Code が状況に応じて適切な方法でコメントアウトの処理を行ってくれるので,複雑なルールを覚える必要がありません.

ブラウザで確認すると本文に入力された見出しのタグが処理されて,見出しとして大きく表示されていることがわかります. (ユーザから入力された文字列に対してこのような処理を行うことは大変な危険を伴うので,動作を確認したら元の状態に戻しておくようにしてください.)

ts-2024-41

目次に戻る