フォームハンドリングのベストプラクティス
Next.js
でのフォームハンドリングは、ユーザーからのデータ収集やアクション処理に欠かせません。効率的なフォームの作成には、データの管理、バリデーション、サーバーとの連携が重要です。以下では、Next.js
でのフォームハンドリングにおけるベストプラクティスを紹介します。
基本的なフォーム作成
Next.js
では、標準のHTMLフォーム要素を使用してフォームを作成できますが、効率的なデータ管理にはreact-hook-form
などのライブラリを活用すると便利です。このライブラリは、フォームの状態管理とバリデーションを簡素化し、パフォーマンスを向上させます。
import { useForm } from 'react-hook-form';
export default function ContactForm() {
const { register, handleSubmit, formState: { errors } } = useForm();
const onSubmit = (data) => {
console.log(data);
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register('name', { required: true })} placeholder="Name" />
{errors.name && <span>Name is required</span>}
<input type="email" {...register('email', { required: true })} placeholder="Email" />
{errors.email && <span>Email is required</span>}
<button type="submit">Submit</button>
</form>
);
}
クライアントサイドバリデーション
クライアントサイドでのバリデーションは、即時にユーザーへフィードバックを提供し、入力ミスを減らします。react-hook-form
やyup
を使うことで、バリデーションルールを簡単に設定できます。例えば、入力が必須か、最低文字数や正規表現による検証を設定できます。
const { register, handleSubmit, formState: { errors } } = useForm({
mode: 'onChange',
});
<input
{...register('email', {
required: 'Email is required',
pattern: {
value: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
message: 'Invalid email address'
}
})}
/>
{errors.email && <span>{errors.email.message}</span>}
APIルートを使ったフォーム送信
フォームデータをサーバーへ送信する際には、Next.js
のAPIルートを利用します。fetch
を使って、フォームデータをPOSTリクエストで送信し、サーバー側でバリデーションと処理を行います。以下は、APIルートを使用したデータ送信の例です。
const submitContact = async (data) => {
const response = await fetch('/api/contact', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
const result = await response.json();
alert(`Thank you, ${result.name}`);
};
サーバーサイドバリデーション
クライアントサイドのバリデーションだけでなく、サーバーサイドでもデータの整合性を確認することが重要です。サーバーサイドでは、APIルートでデータを受け取り、さらに厳密なバリデーションを行い、セキュリティを確保します。
export default function handler(req, res) {
const { name, email } = req.body;
if (!name || !email) {
return res.status(400).json({ message: 'Name and email are required' });
}
res.status(200).json({ message: 'Success', name });
}
まとめ
Next.js
でのフォームハンドリングは、クライアントサイドとサーバーサイドのバリデーションを組み合わせることで、セキュアで効率的なユーザーインターフェースを実現できます。react-hook-form
を使ってデータ管理をシンプルにし、APIルートを活用してサーバーとのやり取りを行うことで、信頼性の高いフォーム機能を構築できます。