✅ はじめに
こんにちは!このシリーズでは、React + Vite + TypeScript + MUIを使ってモダンなWebアプリを開発する方法をステップバイステップで解説しています。
第4回となる今回は、「外部APIとの通信(Axios)」と「状態管理(useState, useEffect)」を学びます。APIから取得したデータを画面に表示する実践的な構成です。
📦 使用する技術スタック
ツール | バージョン | 説明 |
---|---|---|
Axios | v1.x | HTTP通信を行う人気のライブラリ |
MUI | v5.x | マテリアルデザインベースのUIコンポーネント |
TypeScript | 5.x | 型安全なJavaScript |
Vite | 5.x | 高速な開発環境とビルドツール |
🚀 実装手順
1. プロジェクトの作成
まずは、Viteを使って新しいプロジェクトを作成します:
npm create vite@latest react-api-app -- --template react-ts cd react-api-app npm install
2. 必要なパッケージのインストール
MUIとAxiosをインストールします:
npm install @mui/material @emotion/react @emotion/styled @fontsource/roboto axios
3. ユーザー一覧コンポーネントの作成
src/pages/UserList.tsxを作成します:
import type { FC } from 'react'; import { useEffect, useState } from 'react'; import type { AxiosResponse } from 'axios'; import axios from 'axios'; import { Container, Typography, List, ListItem, ListItemText, CircularProgress, Alert, Paper } from '@mui/material'; type User = { id: number; name: string; email: string; }; const UserList: FC = () => { const [users, setUsers] = useState<User[]>([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); useEffect(() => { axios.get<User[]>('https://jsonplaceholder.typicode.com/users') .then((res: AxiosResponse<User[]>) => { setUsers(res.data); setLoading(false); }) .catch(() => { setError('ユーザーの取得に失敗しました。'); setLoading(false); }); }, []); if (loading) { return ( <Container maxWidth="sm"> <Paper elevation={3} sx={{ p: 4, mt: 4, textAlign: 'center' }}> <CircularProgress /> </Paper> </Container> ); } if (error) { return ( <Container maxWidth="sm"> <Paper elevation={3} sx={{ p: 4, mt: 4 }}> <Alert severity="error">{error}</Alert> </Paper> </Container> ); } return ( <Container maxWidth="sm"> <Paper elevation={3} sx={{ p: 4, mt: 4 }}> <Typography variant="h4" component="h1" gutterBottom> ユーザー一覧 </Typography> <List> {users.map(user => ( <ListItem key={user.id} divider> <ListItemText primary={user.name} secondary={user.email} /> </ListItem> ))} </List> </Paper> </Container> ); }; export default UserList;
4. App.tsxの更新
最後に、src/App.tsxを更新してユーザー一覧を表示します:
import { ThemeProvider, createTheme } from '@mui/material'; import UserList from './pages/UserList'; import '@fontsource/roboto/300.css'; import '@fontsource/roboto/400.css'; import '@fontsource/roboto/500.css'; import '@fontsource/roboto/700.css'; const theme = createTheme({ typography: { fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif', }, }); function App() { return ( <ThemeProvider theme={theme}> <UserList /> </ThemeProvider> ); } export default App;
🎯 主要なポイント
1. 状態管理
- useState: データ、ローディング、エラー状態の管理
- useEffect: コンポーネントマウント時のAPI呼び出し
- 型安全な状態管理: TypeScriptによる型定義
2. API通信
- Axios: 型安全なHTTPクライアント
- エラーハンドリング: try-catchによる例外処理
- ローディング表示: ユーザー体験の向上
3. UIコンポーネント
- List/ListItem: データの一覧表示
- CircularProgress: ローディング表示
- Alert: エラーメッセージの表示
🔚 まとめ
今回は、Reactで外部APIからデータを取得し、それを状態として管理して表示する方法を学びました。MUIとAxiosを組み合わせることで、実用的な画面が簡単に作成できることが実感できたと思います。
📚 次回予告
【第5回】React Hook Formによるフォーム処理の実践 - 複数メールアドレスの処理