Apabila menggunakan borang, cangkuk useActionState memudahkan proses menangkap nilai borang dan menghantarnya kepada tindakan pelayan sebagai FormData.
useActionState juga mengurus keadaan dengan mengemas kini pembolehubah keadaan secara automatik dengan nilai yang dikembalikan daripada tindakan pelayan. Ini amat membantu untuk memaparkan ralat pengesahan medan input, seperti yang ditunjukkan dalam contoh di bawah menggunakan Zod.
form.tsx:
"use client"; import { useActionState } from "react"; import { signUp } from "../actions"; export default function SignUp() { const [state, action] = useActionState(signUp, {}); return ( <form action={action}> <div> <label htmlFor="username">Username:</label> <input type="text" > <p>actions.ts:<br> </p> <pre class="brush:php;toolbar:false">"use server"; import { z } from "zod"; const SignUpSchema = z.object({ username: z.string(), password: z .string() .min(8, { message: "Be at least 8 characters long" }) .regex(/[a-zA-Z]/, { message: "Contain at least one letter." }) .regex(/[0-9]/, { message: "Contain at least one number." }) .regex(/[^a-zA-Z0-9]/, { message: "Contain at least one special character.", }) .trim(), }); export type SignUpActionState = { username?: string; password?: string; errors?: { username?: string[]; password?: string[]; }; }; export async function signUp( _prevState: SignUpActionState, form: FormData ): Promise<SignUpActionState> { const username = form.get("username") as string; const password = form.get("password") as string; const validatedFields = SignUpSchema.safeParse({ username, password, }); if (!validatedFields.success) { return { username, password, errors: validatedFields.error.flatten().fieldErrors, }; } // process validated form inputs here return { username, password }; }
useActionState juga mengembalikan sifat isPending (contoh) yang menunjukkan sama ada janji tindakan pelayan masih diselesaikan.
Reference isPending untuk melumpuhkan sementara elemen borang, seperti butang serah, untuk menghalang pengguna daripada mengkliknya beberapa kali berturut-turut sebelum tindakan yang sedang berjalan selesai.
Jika anda biasa dengan useFormAction dan useFormStatus, anda akan mendapati useActionState agak serupa.
Pada asasnya, ia menggabungkan kefungsian kedua-dua cangkuk dan dinamakan semula untuk menggambarkan bahawa tindakan pelayan bukan hanya untuk borang (anda juga boleh menggunakan useActionState dengan butang dan elemen lain.)
Perlu diingat bahawa useFormStatus telah ditamatkan pada Next.js 15, jadi anda harus mengimport useActionState ke hadapan.
Atas ialah kandungan terperinci Ketahui useActionState dengan cepat dengan contoh (Next.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!