Server Actions are async functions that run on the server, callable from client components.
Code:
1// actions.ts2"use server";34export async function createTodo(formData: FormData) {5 const title = formData.get("title") as string;6 await db.todos.create({ data: { title } });7 revalidatePath("/todos");8}910// Client Component11import { createTodo } from "./actions";1213function TodoForm() {14 return (15 <form action={createTodo}>16 <input name="title" type="text" required />17 <button type="submit">Add Todo</button>18 </form>19 );20}
With useActionState:
1import { useActionState } from "react";23function TodoForm() {4 const [state, formAction, isPending] = useActionState(5 async (prev, formData) => {6 const title = formData.get("title");7 if (!title) return { error: "Title required" };8 await createTodo(formData);9 return { success: true };10 },11 null12 );1314 return (15 <form action={formAction}>16 <input name="title" type="text" />17 {state?.error && <p className="error">{state.error}</p>}18 <button disabled={isPending}>Add</button>19 </form>20 );21}
Use cases:
Benefits: