データ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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Next.jsのCache Options付きfetch()
- unstable_cacheとReact cache()
- Incremental Static Regeneration(ISR)
- データMutationのためのServer Actions