第四章:フロントエンドを生き生きと!API連携、Axiosと非同期の魔法
前章では、モックデータを使って美しいテーブルとリアルタイム検索機能を作成しました。しかし、上司にこのページを見せると、「なぜ表示されている名前は全て王小明と李大華なのか?今日の私の打刻記録はなぜ出てこない?」と質問されるでしょう。
その通り、フロントエンドのデータはコード内にハードコードされており、現実世界で何が起こっているかを知りません。 現実の世界では、フロントエンドのウェブページは「バックエンドサーバー(例えば以前作成したFastAPI)」に最新データを要求する必要があります。このフロントエンドとバックエンドの通信の橋渡しを**API(アプリケーション・プログラミング・インターフェース)**と呼びます。
🎯 本章の目標
- フロントエンドとバックエンドの通信の基本ロジックを理解する:HTTPリクエストとは?APIとは?
- 業界最強のHTTPクライア��トライブラリ
axiosを学ぶ。 - Reactの
useEffectフックをマスターし、「ページが開いたら自動的にデータを取得する」機能を実装する。 - 「ローディング中(Loading)」と「エラー(Error)」の状態を処理する。これはプロのフロントエンドエンジニアに必須のスキルです。
📞 APIとは?FetchとAxiosとは?(図解でわかりやすく説明)
高級フレンチレストランで食事をする場面を想像してください:
- あなた(フロントエンド):美しいメニュー(UIインターフェース)を見て、何を食べるか決めます。しかし、自分で厨房に入って料理を取ることはできません。
- 厨房(バックエンドデータベース):全ての食材(打刻記録)が保管されており、シェフ(FastAPI)が料理を担当しています。
- ウェイター(API):注文票をウェイターに渡すと、ウェイターは厨房に行き料理を運んできてくれます。この「注文」と「料理を運ぶ」動作がAPI呼び出しです。
JavaScriptでは、ウェイターを呼び出す最も基本的な方法はfetch()というネイティブ関数です。
しかし、fetchは少し冗長で、JSON形式を扱う際に変換が必要であり、エラー処理もあまりスマートではありません。
そのため、世界中のフロントエンドエンジニアはAxiosというサードパーティライブラリを使用しています。Axiosはデータ取得プロセスを非常にエレガントにし、様々な強力な機能を備えています。
🚀 実践:AxiosのインストールとAPIインスタンス(Instance)の作成
🔥【Vibe Prompt 実践呪文】
React(Vite)プロジェクトを開発中で、ローカルのFastAPIバックエンドAPIに接続する必要があります。1. npmでaxiosをインストールするコマンドを教えてください。2. 業界標準の方法として、API接続設定は独立させます。src/utils/にapi.tsファイルを作成してください。3. api.ts内でaxios.createを使用してインスタンスを作成し、baseURLを'http://localhost:8000/api'に、タイムアウトを5000ミリ秒に設定してください。
AIはターミナルで次のコマンドを実行するように指示します:
npm install axios
そして完璧なAPIモジュール設定ファイルを生成します:
// 📂 src/utils/api.ts
import axios from 'axios';
// Axiosインスタンスを作成
// こうすることで、今後APIを呼び出す際に毎回長いURLを入力する必要がなく、'/punches'と書くだけで済みます!
export const apiClient = axios.create({
baseURL: 'http://localhost:8000/api', // FastAPIのローカルURL
timeout: 5000, // ウェイターが厨房から5秒以内に戻ってこない場合、注文失敗(タイムアウト)と判定
headers: {
'Content-Type': 'application/json',
},
});
⏳ useEffectと組み合わせ:画面読み込み時にデータを取得
apiClientを準備したら、いつ呼び出すべきでしょうか?
答えは:このData Tableコンポーネントが初めて画面に表示された時です!
Reactでは、「初めて表示された時に何かを行う」を制御するために、強力なuseEffectを使用します。
🔥【Vibe Prompt 実践呪文】
以前のDataTable.tsxを修正し、ハードコードされたmockDataを実際のAPI呼び出しに置き換えてください。1. 作成したapiClientをインポートしてください。2. useEffectを使用してコンポーネントの【初回マウント時】にGET /punches APIを呼び出してください。3. 3つの状態を必ず処理してください:データ(data)、ローディング中(isLoading、デフォルトtrue)、エラーメッセージ(error)。4. 画面レンダリング時、isLoadingがtrueの場合、スピナーまたは「データ読み込み中...」というテキストを表示してください。errorに値がある場合、赤色のエラー警告を表示してください。5. データを取得したら、バックエンドから返された配列をdata stateにセットしてください。
AIはプロフェッショナルな非同期(Async/Await)コードを生成します:
import { useEffect, useState } from 'react';
import { apiClient } from '../utils/api';
export default function DataTable() {
const [data, setData] = useState([]);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
// 💡 useEffectの最後に空配列[]を渡すと、このロジックは「画面が初めて表示された時」に1回だけ実行されます!
useEffect(() => {
const fetchPunchRecords = async () => {
try {
setIsLoading(true);
// ウェイター(API)に注文(/punchesのデータをリクエスト)
const response = await apiClient.get('/punches');
// ウェイターが運んできた料理をテーブル(State)にセット
setData(response.data);
} catch (err) {
console.error("API呼び出し失敗", err);
setError("打刻記録を取得できません。サーバーが起動しているか確認してください。");
} finally {
// 成功しても失敗しても、最後にローディングアニメーションを必ず停止!
setIsLoading(false);
}
};
fetchPunchRecords();
}, []);
// レンダリングのフォールバック処理:三項状態処理
if (isLoading) return <div className="p-10 text-center animate-pulse">📡 サーバーからデータを取得中...</div>;
if (error) return <div className="p-10 text-center text-red-500 bg-red-50 rounded-lg">❌ {error}</div>;
return (
// ... ここに元の美しいテーブルをレンダリングし、実際のdataを渡す ...
<div>
{/* テーブルUIは省略... */}
</div>
);
}
💼 [ビジネス応用シナリオ] なぜSkeleton(スケルトンスクリーン)が重要なのか?
上記の実装では、isLoadingの状態を追加しました。このシステムを大企業に販売する場合、これは非常に重要です。
ウェブページがバックエンドのデータを待っている0.5秒間、画面上に何も表示されない場合、ユーザーはサイトがフリーズしたと思い、リフレッシュボタンを狂ったようにクリックし始めます��これによりAPIリクエストが2倍になり、最終的にサーバーを圧迫します。
これは**User Perceived Latency(ユーザーが感じる遅延)**と呼ばれます。 プロの開発者として、PromptでAIに「isLoading時にTailwindで書かれたSkeleton(スケルトンスクリーン)エフェクトを表示してください」と指示できます。画面上に灰色で点滅する仮のブロックを表示させます。 ユーザーは点滅するブロックを見て、「システムが動作中」と感じ、忍耐力が0.5秒から3秒に延びます。この小さなUIの詳細が、初心者とベテランエンジニアの大きな違いです!
✅ 本章のまとめ
フロントエンドエンジニアの日常業務の核心を学びました:バックエンドにデータを要求し、待機とエラーをエレガントに処理し、実際のデータを画面に表示すること!
しかし、このコードを初めて実行し、Chromeブラウザを見ると、データは表示されず、フロントエンド開発者の永遠の敵「CORSクロスオリジン制限エラー」に遭遇するでしょう。 心配ありません!全てのエンジニアがこの挫折を経験しています。次章では、最もわかりやすい方法でCORSの秘密を解き明かし、Promptを使って一瞬で解決する方法を教えます!