[今さら始める Next.js マスター #5] Server Actionsでフォームを扱う
API Routeを増やさずにフォーム送信を処理するServer Actionsの基本、バリデーション、状態表示を整理します。
[今さら始める Next.js マスター #5] Server Actionsでフォームを扱う
Server Actionsとは
Server Actionsは、サーバー側で実行される関数をフォーム送信やユーザー操作から呼び出す仕組みです。単純なフォーム処理なら、別途API Routeを作らずに実装できます。
入力を受け取り、検証し、データベースに保存し、必要なら画面を更新するところまでをNext.jsの流れの中で扱えます。
基本的なフォーム処理
Server Actionは"use server"を付けて定義します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
async function createPost(formData: FormData) {
"use server";
const title = formData.get("title");
// 保存処理を書く
}
export default function PostForm() {
return (
<form action={createPost}>
<input name="title" />
<button type="submit">Save</button>
</form>
);
}
フォームのactionに関数を渡せるため、クライアント側のfetch処理を書かなくても送信できます。
バリデーションとエラー処理
実務では、入力値の検証が欠かせません。空文字、文字数、形式、権限などをサーバー側で確認します。
| 確認すること | 例 |
|---|---|
| 必須入力 | タイトルが空ではない |
| 形式 | メールアドレスの形になっている |
| 権限 | 投稿できるユーザーか |
| 重複 | 同じslugが存在しないか |
クライアント側のチェックは便利ですが、信頼できる最終確認は必ずサーバー側で行います。
Progressive Enhancement
Server Actionsは、JavaScriptが読み込まれる前でもフォーム送信を成立させやすい設計です。これをProgressive Enhancementと呼びます。
まずHTMLとして自然に動くフォームを作り、その上にローディング表示や楽観的更新などの体験を重ねていくと、壊れにくいUIになります。
useActionStateとuseFormStatus
送信結果やエラーを画面に出したい場合はuseActionState、送信中の状態をボタンなどに反映したい場合はuseFormStatusが役立ちます。
Server Actionsは、フォーム処理をNext.jsらしく短く書ける便利な機能です。ただし、認証、検証、権限チェックは省略せず、サーバー側の責務として丁寧に扱う必要があります。
この投稿は投稿者によって CC BY 4.0 の下でライセンスされています。
