0Pricing
React Academy · レッスン

データMutationのためのServer Actions

'use server' functionsでフォームのmutationを処理し、revalidatePathでキャッシュを無効化します。

「データMutationのためのServer Actions」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

Server Actionsとは

Server Actionsは'use server'を付けた非同期関数で、サーバー上でのみ実行されます。API route handlerを書かなくても、フォーム送信やデータのミューテーションを実行できます。

Server Actionの定義

関数の先頭(またはファイルの先頭)に'use server'を追加すると、Server Actionを作成できます。Server Component内、または専用のactions.tsファイル内でのみ定義できます。

// app/actions.ts
'use server';

import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';

export async function createPost(formData: FormData) {
  const title = formData.get('title') as string;
  await db.post.create({ data: { title } });
  revalidatePath('/blog');
  redirect('/blog');
}

フォームでのActionの使用

Action関数をフォームのactionプロパティに渡します。onSubmitもイベントハンドラーも必要ありません。Next.jsがフォームをシリアライズし、サーバー側でActionを呼び出します。

import { createPost } from './actions';

export default function NewPostForm() {
  return (
    <form action={createPost}>
      <input name="title" placeholder="Post title" required />
      <button type="submit">Create</button>
    </form>
  );
}

useActionStateフック

useActionState(React 19)はActionをラップし、保留中の状態を追跡するとともに、Actionの戻り値をコンポーネントで受け取れるようにします。

'use client';
import { useActionState } from 'react';
import { createPost } from './actions';

const initialState = { error: null };

export function PostForm() {
  const [state, action, isPending] = useActionState(createPost, initialState);
  return (
    <form action={action}>
      {state.error && <p className="error">{state.error}</p>}
      <input name="title" />
      <button disabled={isPending}>{isPending ? 'Creating...' : 'Create'}</button>
    </form>
  );
}

バリデーションエラーの返却

例外をスローする代わりにActionからオブジェクトを返すと、useActionStateを介してバリデーションエラーをフォームに渡せます。

export async function createPost(prevState: any, formData: FormData) {
  'use server';
  const title = formData.get('title') as string;
  if (!title || title.length < 3) {
    return { error: 'Title must be at least 3 characters' };
  }
  await db.post.create({ data: { title } });
  revalidatePath('/blog');
  redirect('/blog');
}

イベントハンドラーでのServer Actions

Client Componentのイベントハンドラーからも、フォームActionに限らず、Server Actionsを直接インポートして呼び出せます。

'use client';
import { deletePost } from './actions';

export function DeleteButton({ id }: { id: string }) {
  return (
    <button onClick={() => deletePost(id)}>
      Delete
    </button>
  );
}

インラインServer Actions

Server Component内で、関数の中に'use server'を記述してServer Actionsをインライン定義できます。ミューテーションのロジックを呼び出し元の近くに配置する場合に便利です。

export default function PostPage({ post }) {
  async function updatePost(formData: FormData) {
    'use server';
    await db.post.update({ where: { id: post.id }, data: { title: formData.get('title') as string } });
    revalidatePath(`/blog/${post.id}`);
  }

  return (
    <form action={updatePost}>
      <input name="title" defaultValue={post.title} />
      <button type="submit">Save</button>
    </form>
  );
}

Server ActionsでのuseOptimistic

Server ActionsとuseOptimisticを組み合わせると、Actionがバックグラウンドで実行されている間にUIをすぐ更新できます。

'use client';
import { useOptimistic } from 'react';
import { addItem } from './actions';

export function TodoList({ items }) {
  const [optimisticItems, addOptimistic] = useOptimistic(items, (state, newItem) => [...state, newItem]);
  return (
    <form action={async (formData) => {
      addOptimistic({ id: 'temp', text: formData.get('text') });
      await addItem(formData);
    }}>
      <ul>{optimisticItems.map(i => <li key={i.id}>{i.text}</li>)}</ul>
      <input name="text" /><button>Add</button>
    </form>
  );
}

セキュリティ上の考慮事項

Server Actionsは内部的にはPOSTエンドポイントです。サーバー側で必ず入力値を検証・サニタイズし、認証を確認し、CSRF対策を使用してください(同一オリジンの場合、Next.jsが自動的に処理します)。

ミューテーション後の再検証

ミューテーション後にrevalidatePath()またはrevalidateTag()を呼び出し、関連するキャッシュを消去します。これにより、次回のページ読み込みに変更が反映されます。

理解度チェック

Next.js App RouterでServer Actionをフォームに渡すには、どうすればよいですか。

まとめ

Server Actionsは、サーバー側でミューテーションを処理する'use server'付きの非同期関数です。actionプロパティでフォームに接続し、useActionStateで状態を追跡します。バリデーションでは例外をスローする代わりにエラーを返し、ミューテーション後にキャッシュを再検証してください。

よくある質問

「データMutationのためのServer Actions」レッスンは無料ですか?

はい。「データMutationのためのServer Actions」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「データMutationのためのServer Actions」で何を学びますか?

'use server' functionsでフォームのmutationを処理し、revalidatePathでキャッシュを無効化します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「データMutationのためのServer Actions」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Next.jsのCache Options付きfetch()
  2. unstable_cacheとReact cache()
  3. Incremental Static Regeneration(ISR)
  4. データMutationのためのServer Actions
← React Academyに戻る