Form Actions:ミューテーションのAPI Routesを置き換える
Server ActionsをHTMLフォームのactionに直接接続し、定型コードなしでフォームのミューテーションと完全な再検証を実現します。
「Form Actions:ミューテーションのAPI Routesを置き換える」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
従来のパターン
従来のNext.jsアプリケーションでは、フォーム送信にクライアントコンポーネントが必要です。その中のonSubmitハンドラーからfetch()を呼び出し、API RouteへデータをPOSTします。このパターンは動作しますが、クライアント側のfetchロジックとサーバー側のRouteハンドラーを別々に記述して保守する必要があります。
Server Actionsでフォームを簡素化
Server Actionsを使うと、fetch呼び出しとAPI Routeを1つの関数に置き換えられます。フォーム要素には、actionプロパティとしてServer Actionを指定します:<form action={serverAction}>。Reactが送信をインターセプトし、フォームデータを渡してActionを自動的に呼び出します。
FormDataによるフォームフィールドへのアクセス
フォームから呼び出された場合、Server Actionは引数としてFormDataオブジェクトを自動的に受け取ります。個々のフィールドにはformData.get('email')でアクセスでき、値は文字列として返されます。複数選択フィールドに使用するgetAll()など、FormDataの標準メソッドをすべて利用できます。
Actionからの結果の返却
Server Actionは、クライアントで利用できるシリアライズ可能な値を返せます。{ error: 'Email already exists' }のようなエラーオブジェクトや、{ success: true }のような成功フラグを返すことで、ページ全体を再読み込みせずにクライアント側でUIを適切に更新できます。
ページコンポーネントをシンプルに保つ
フォームのactionがServer Actionであるため、フォームを配置するページコンポーネントをClient Componentにする必要はありません。サーバーがフォームを静的HTMLとしてレンダリングし、エラー表示などのインタラクティブな部分だけがクライアント側のJavaScriptを必要とします。これにより、クライアントバンドルを大幅に小さくできます。
プログレッシブエンハンスメントを標準搭載
action={serverAction}を指定したフォームは、JavaScriptが有効でなくても動作します。ブラウザーは標準のHTMLフォームPOSTを実行し、サーバーがActionを実行して更新後のページを返します。この真のプログレッシブエンハンスメントにより、あらゆる環境でフォームが適切に機能します。
ミューテーション後のデータの再検証
Server Actionでデータを変更した後は、キャッシュされたページデータを更新する必要があります。Action内でrevalidatePath('/dashboard')を呼び出すと、そのパスに対するNext.jsのキャッシュが無効化され、次のリクエストで最新のデータが取得されます。これは、ミューテーション後にサーバーレンダリングされたページを最新の状態に保つ標準的な方法です。
きめ細かなキャッシュ無効化
revalidateTag('user-data')を使うと、revalidatePathよりきめ細かくキャッシュを無効化できます。next: { tags: ['user-data'] }を指定してfetch呼び出しにタグを付け、Server Action内からタグ付けされたすべてのデータを一度に無効化します。そのデータを表示するパスがどれであるかは問いません。
Action後のリダイレクト
Server Actionsでは、ミューテーションが成功した後にnext/navigationモジュールのredirect('/success')を呼び出して、ユーザーを新しいページへリダイレクトできます。このリダイレクトはサーバー側で処理されるため、ブラウザーはクライアント側のリダイレクトではなく、適切なナビゲーションレスポンスを受け取ります。
startTransitionによるフォーム以外のミューテーション
Server Actionsはフォーム送信に限定されません。ボタンのクリックなどフォーム以外のトリガーでは、Actionの呼び出しをstartTransition(() => action(arg))でラップします。これによりナビゲーションがトランジションとして扱われ、サーバー上でActionが実行されている間もReactは現在のUIを表示し続けられます。
Action内でのバリデーション
サーバー側のバリデーションにはServer Actionsが適しています。FormDataのフィールドを検証し、検証に失敗した場合はエラーを返し、すべてのフィールドが有効な場合にだけミューテーションを実行します。Zodのようなライブラリも適しています。FormDataを型付きスキーマにパースし、失敗時にはエラーマップを返せます。
FormDataに関する問題
フォーム送信によって呼び出された場合、Server Actionは引数として何を受け取りますか。
レッスンのまとめ
Server Actionsは、フォームのミューテーションで使われてきたfetch + API Routeパターンに置き換わるものです。フォームのactionプロパティにはServer Actionを直接指定でき、ActionはFormDataオブジェクトを受け取ります。ActionはクライアントUIの更新に使えるシリアライズ可能な結果を返し、キャッシュ無効化のためのrevalidatePathとrevalidateTagをサポートします。また、JavaScriptがなくてもプログレッシブに動作します。
よくある質問
「Form Actions:ミューテーションのAPI Routesを置き換える」レッスンは無料ですか?
はい。「Form Actions:ミューテーションのAPI Routesを置き換える」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「Form Actions:ミューテーションのAPI Routesを置き換える」で何を学びますか?
Server ActionsをHTMLフォームのactionに直接接続し、定型コードなしでフォームのミューテーションと完全な再検証を実現します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Form Actions:ミューテーションのAPI Routesを置き換える」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- React 19とNext.jsのServer Actions
- Form Actions:ミューテーションのAPI Routesを置き換える
- useActionStateとuseFormStatus
- Server Actionsによるプログレッシブエンハンスメント