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

React 入門トップページ

« 戻る 次へ »

React 入門

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

コメント詳細情報を表示する

ここでは CommentShowPage コンポーネントで API から指定した id のコメントを取得して,その詳細情報を表示するようにします.ターミナル(またはコマンドプロンプト)から curl コマンドでコメントの ID を指定してコメント情報を取得する方法を示します.なお,コマンド最後の /9/ にはコメントの ID を指定することに注意してください.

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

プログラムの先頭で useStateuseEffectaxios をインポートします.

src/components/CommentShowPage.js(抜粋)import React from 'react'
import { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';
import axios from 'axios';

次の9行目では API から取得したコメントデータを管理する data とそれを更新する関数 setData を定義しています.12行目からの useEffectでは依存する値が空配列 [] であることから,初回読み込み時にだけ API からコメントデータを取得して非同期的に画面を更新します.31行目では読み込んだコメントの詳細情報を表示しています.

src/components/CommentShowPage.jsimport React from 'react'
import { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';
import axios from 'axios';

const CommentShowPage = () => {
  const params = useParams();

  const [data, setData] = useState(null);
  const url = `http://127.0.0.1:8000/comments/${params.commentId}/`;

  useEffect(() => {
    axios.get(url)
      .then(res => setData(res.data))
      .catch(err => console.log(err.message));
  }, []);

  if (data === null) {
    return (
      <div className="container">
        <h1>コメント</h1>
        <article>
        </article>
      </div>
    );
  }

  return (
    <div className="container">
      <h1>コメント</h1>
      <article>
        <div>ID: {data.id}</div>
        <div className="title">Title: {data.title}</div>
        <div className="body">Body: {data.body}</div>
        <div>最終更新: {data.updated_at}</div>
      </article>
    </div>
  )
}

export default CommentShowPage

上記のコードの32〜35行目で,初回読み込み時の API からの読み込みが終了するまでは data の値が初期値の null であることから,data.title のようにプロパティにアクセスしようとするとエラーが発生します.これを防止する方法は幾つかありますが,上記では18行目の if による条件分岐でエラーを防止しています.もう一つの方法は,ここと同じ考え方で9行目の useState() にオブジェクトの初期値を渡す方法が考えられます.

コメントの詳細表示ページをブラウザで確認します.

react-2024-86

目次に戻る