✅ はじめに
こんにちは!このシリーズでは、React + Vite + TypeScript + MUIという現代的な技術スタックを使って、Webアプリを開発する方法をステップバイステップで解説しています。
第3回となる今回は、フォームの作成とバリデーションを扱います。UIには MUI を、バリデーションには React Hook Form を使って、シンプルかつ堅牢なフォームを作成していきましょう。
📦 使用する技術スタック
| ツール | バージョン | 説明 |
|---|---|---|
| React Hook Form | v7.x | フォーム管理とバリデーション |
| MUI | v5.x | マテリアルデザインベースのUIコンポーネント |
| TypeScript | 5.x | 型安全なJavaScript |
| Vite | 5.x | 高速な開発環境とビルドツール |
🚀 実装手順
1. プロジェクトの作成
まずは、Viteを使って新しいプロジェクトを作成します:
npm create vite@latest my-react-form-app -- --template react-ts cd my-react-form-app npm install
2. 必要なパッケージのインストール
MUIとReact Hook Formをインストールします:
npm install @mui/material @emotion/react @emotion/styled @fontsource/roboto react-hook-form
3. フォームコンポーネントの作成
src/pages/UserForm.tsxを作成します:
import type { FC } from 'react';
import { useForm } from 'react-hook-form';
import { TextField, Button, Container, Typography, Paper } from '@mui/material';
type FormData = {
name: string;
email: string;
};
const UserForm: FC = () => {
const {
register,
handleSubmit,
formState: { errors },
} = useForm<FormData>();
const onSubmit = (data: FormData): void => {
alert(`名前: ${data.name}\nメール: ${data.email}`);
};
return (
<Container maxWidth="sm">
<Paper elevation={3} sx={{ p: 4, mt: 4 }}>
<Typography variant="h4" component="h1" gutterBottom>
ユーザーフォーム
</Typography>
<form onSubmit={handleSubmit(onSubmit)} noValidate>
<TextField
fullWidth
label="名前"
margin="normal"
{...register('name', { required: '名前は必須です' })}
error={!!errors.name}
helperText={errors.name?.message}
/>
<TextField
fullWidth
label="メール"
margin="normal"
{...register('email', {
required: 'メールは必須です',
pattern: {
value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
message: '有効なメールアドレスを入力してください',
},
})}
error={!!errors.email}
helperText={errors.email?.message}
/>
<Button
variant="contained"
type="submit"
sx={{ mt: 2 }}
fullWidth
>
送信
</Button>
</form>
</Paper>
</Container>
);
};
export default UserForm;
4. App.tsxの更新
最後に、src/App.tsxを更新してフォームを表示します:
import { ThemeProvider, createTheme } from '@mui/material';
import UserForm from './pages/UserForm';
const theme = createTheme({
typography: {
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
},
});
function App() {
return (
<ThemeProvider theme={theme}>
<UserForm />
</ThemeProvider>
);
}
export default App;
🎯 主要なポイント
1. React Hook Formの基本概念
- useForm: フォームの状態管理とバリデーションを提供
- register: フォームフィールドの登録とバリデーションルールの設定
- handleSubmit: フォーム送信時の処理を管理
- formState: エラー状態などのフォーム状態を管理
2. MUIフォームコンポーネント
- TextField: 入力フィールドのスタイリングとエラー表示
- Container: レスポンシブなレイアウト
- Paper: カード風のコンテナスタイリング
3. TypeScriptの型安全性
- FC型: Reactの関数コンポーネントの型定義
- FormData型: フォームデータの型定義
- 明示的な戻り値の型: 関数の戻り値型を指定
🔚 まとめ
今回は、React Hook FormとMUIを組み合わせて、型安全なバリデーション機能付きフォームを実装しました。この組み合わせは実用的で、多くの商用アプリでも採用されています。
📚 次回予告
【第4回】状態管理とAPI通信(React + Axios)