Reactのカスタムフックで複数APIを同時に呼び出す方法を解説!初心者でも理解できるAPI管理の基本
生徒
「Reactでカスタムフックを使ってAPIを呼び出す方法ってありますか?」
先生
「もちろんあります。カスタムフックを作ると、APIの呼び出しを何度も同じように書かなくて済むので便利なんです。」
生徒
「じゃあ複数のAPIを同時に呼び出すこともできますか?」
先生
「はい、できますよ!しかもJavaScriptのPromiseという仕組みを使えば、同時にリクエストして結果をまとめて受け取れるんです。」
1. ReactとAPIの関係を理解しよう
Reactは、ユーザーに画面を表示するライブラリですが、その画面に表示するデータはサーバーや外部サービスから取得する必要があります。このとき使うのが「API」です。APIは、アプリケーションとサービスの間でデータをやり取りする仕組みで、例えば天気情報やニュース記事などを取得するときに使います。
通常、APIを呼び出すにはfetchやaxiosといったツールを使います。しかし同じ処理を何度も書くのは大変なので、Reactでは「カスタムフック」を作ってAPIの呼び出しをまとめて管理するのが一般的です。
2. カスタムフックとは?初心者向けに解説
カスタムフックとは、自分で作れる特別な関数のことです。ReactにはuseStateやuseEffectといった「フック」がありますが、それを組み合わせて自分専用の便利な処理を作ることができます。
たとえば、APIを呼び出して結果をstateに保存し、読み込み中やエラーを管理する処理をまとめてカスタムフックにすると、どのコンポーネントでも簡単に使い回せるようになります。
3. 複数APIを同時に呼び出す仕組み
複数のAPIを同時に呼び出すには、JavaScriptのPromise.allという仕組みを使います。Promise.allは「すべてのAPIの処理が終わるまで待ってから結果をまとめて返す」という便利な機能です。
これをカスタムフックに組み込むことで、複数のデータを一度に取得し、効率よく画面に表示できるようになります。
4. 実際にカスタムフックを作ってみよう
ここでは例として、ユーザー情報と記事情報を同時に取得するカスタムフックを作ります。
import { useState, useEffect } from "react";
function useMultipleAPIs() {
const [data, setData] = useState({ users: null, posts: null });
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchAPIs = async () => {
try {
const [usersRes, postsRes] = await Promise.all([
fetch("https://jsonplaceholder.typicode.com/users"),
fetch("https://jsonplaceholder.typicode.com/posts")
]);
const users = await usersRes.json();
const posts = await postsRes.json();
setData({ users, posts });
} catch (err) {
setError(err);
} finally {
setLoading(false);
}
};
fetchAPIs();
}, []);
return { data, loading, error };
}
export default useMultipleAPIs;
5. カスタムフックをコンポーネントで使う方法
作成したカスタムフックは、通常のフックと同じようにコンポーネントの中で呼び出して使います。
import React from "react";
import useMultipleAPIs from "./useMultipleAPIs";
function App() {
const { data, loading, error } = useMultipleAPIs();
if (loading) return <p>読み込み中です...</p>;
if (error) return <p>エラーが発生しました: {error.message}</p>;
return (
<div>
<h1>ユーザー一覧</h1>
<ul>
{data.users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
<h1>記事一覧</h1>
<ul>
{data.posts.slice(0, 5).map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
}
export default App;
6. 複数APIを同時に呼び出すメリット
複数のAPIを同時に呼び出すことで、通信時間を短縮できるという大きなメリットがあります。もし一つずつ順番に呼び出したら、最初の処理が終わるまで次が始まらないので全体の待ち時間が長くなってしまいます。Promise.allを使えば同時に処理できるので、結果を効率よく取得できます。
また、カスタムフックにまとめることで、複数のコンポーネントから同じ処理を再利用でき、コードの見通しもよくなります。
7. エラー処理や拡張性について
現実のアプリケーションでは、複数APIのうち一つが失敗することもあります。その場合でもエラーをキャッチして適切にメッセージを表示できるようにしておくと、ユーザーにとって使いやすいアプリになります。
さらに、APIが増えてもPromise.allに追加するだけで簡単に対応できるので、拡張性の高い仕組みを作れます。