0Pricing
React Academy · บทเรียน

React Actions และ useActionState

กำหนดแอ็กชันฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ จัดการการส่งฟอร์ม และติดตามสถานะกำลังดำเนินการ

React Actions และ useActionState เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

ในบทเรียนนี้ คุณจะกำหนด React 19 Actions ใช้ useActionState เพื่อจัดการสถานะการส่งแบบฟอร์ม และจัดการสถานะรอดำเนินการกับสถานะข้อผิดพลาดได้อย่างเป็นระเบียบ

React Actions คืออะไร

แอ็กชันคือฟังก์ชันแบบอะซิงโครนัสที่คุณส่งให้พร็อพ `action` ของแบบฟอร์ม (หรือ `formAction` ของปุ่ม) React 19 จะจัดการฟังก์ชันเหล่านี้เป็นพิเศษ โดยติดตามสถานะรอดำเนินการ จัดการข้อผิดพลาด และผสานการทำงานกับทรานซิชันโดยอัตโนมัติ

แอ็กชันฝั่งเซิร์ฟเวอร์ใน Next.js

ใน Next.js ที่ใช้ App Router ให้เพิ่ม 'use server' ไว้ด้านบนของฟังก์ชันเพื่อเปลี่ยนฟังก์ชันนั้นให้เป็นแอ็กชันฝั่งเซิร์ฟเวอร์ React จะเรียกใช้ฟังก์ชันนี้บนเซิร์ฟเวอร์เมื่อมีการส่งแบบฟอร์ม โดยไม่จำเป็นต้องมีเส้นทาง API
'use server';

export async function createPost(formData) {
  const title = formData.get('title');
  await db.insert(posts).values({ title });
  revalidatePath('/posts');
}

การใช้แอ็กชันกับแบบฟอร์ม

ส่งแอ็กชันฝั่งเซิร์ฟเวอร์หรือฝั่งไคลเอนต์โดยตรงให้กับพร็อพ `action` ของแบบฟอร์ม React จะเรียกใช้แอ็กชันนั้นพร้อมกับ FormData เมื่อมีการส่งแบบฟอร์ม
import { createPost } from './actions';

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

useActionState

useActionState จะห่อหุ้มแอ็กชันเพื่อมอบสถานะปัจจุบัน (ผลลัพธ์ล่าสุดของแอ็กชัน) และค่าบูลีนที่ระบุว่ากำลังดำเนินการอยู่ ฟังก์ชันที่ถูกห่อหุ้มจะถูกส่งให้กับ action ของแบบฟอร์ม
'use client';
import { useActionState } from 'react';
import { createPost } from './actions';

function NewPostForm() {
  const [state, action, isPending] = useActionState(createPost, null);
  return (
    <form action={action}>
      {state?.error && <p>{state.error}</p>}
      <input name="title" />
      <button disabled={isPending}>Create</button>
    </form>
  );
}

แอ็กชันที่ส่งคืนสถานะ

แอ็กชันฝั่งเซิร์ฟเวอร์จะได้รับ `(prevState, formData)` เมื่อใช้ร่วมกับ useActionState ให้ส่งคืนออบเจ็กต์ที่มีข้อมูลความสำเร็จหรือข้อผิดพลาด ซึ่งจะกลายเป็นสถานะใหม่
'use server';

export async function createPost(prevState, formData) {
  const title = formData.get('title')?.toString();
  if (!title) return { error: 'Title is required' };
  await db.insert(posts).values({ title });
  return { success: true };
}

isPending สำหรับปิดใช้งานปุ่มส่ง

ใช้ค่า isPending จาก useActionState เพื่อปิดใช้งานปุ่มส่งและแสดงตัวบ่งชี้การโหลดขณะที่แอ็กชันกำลังทำงาน
<button type="submit" disabled={isPending}>
  {isPending ? 'Saving...' : 'Save'}
</button>

แอ็กชันฝั่งไคลเอนต์

แอ็กชันไม่จำเป็นต้องทำงานบนเซิร์ฟเวอร์เสมอไป แอ็กชันฝั่งไคลเอนต์คือฟังก์ชันแบบอะซิงโครนัสทั่วไปที่ไม่มี 'use server' และยังคงได้รับการจัดการสถานะกับสถานะรอดำเนินการจาก useActionState
async function clientAction(prevState, formData) {
  const res = await fetch('/api/post', {
    method: 'POST', body: formData,
  });
  if (!res.ok) return { error: 'Failed' };
  return { success: true };
}

useFormStatus สำหรับคอมโพเนนต์ลูก

ในปุ่มส่งที่อยู่ภายในหลายระดับ ให้ใช้ `useFormStatus()` เพื่ออ่านสถานะรอดำเนินการของแบบฟอร์มแม่โดยไม่ต้องส่งพร็อพผ่านคอมโพเนนต์แต่ละระดับ
'use client';
import { useFormStatus } from 'react-dom';

function SubmitButton() {
  const { pending } = useFormStatus();
  return <button disabled={pending}>Submit</button>;
}

การปรับปรุงการทำงานแบบค่อยเป็นค่อยไป

React Actions ที่ใช้ร่วมกับแอ็กชันฝั่งเซิร์ฟเวอร์ยังทำงานได้แม้ไม่มี JavaScript (การปรับปรุงการทำงานแบบค่อยเป็นค่อยไป) เบราว์เซอร์จะส่ง POST ของแบบฟอร์มแบบเนทีฟไปยังตัวจัดการของ Next.js ทำให้ฟีเจอร์นี้ใช้งานได้ตั้งแต่ก่อนที่ JS จะโหลดเสร็จ

ตรวจสอบความเข้าใจอย่างรวดเร็ว

useActionState ส่งคืนค่าใดที่ช่วยให้คุณแสดงสถานะกำลังโหลดขณะที่แอ็กชันของแบบฟอร์มกำลังทำงาน

สรุปทบทวน

React Actions คือฟังก์ชันแบบอะซิงโครนัสที่ส่งให้กับ action ของแบบฟอร์ม useActionState จะห่อหุ้มแอ็กชันเพื่อมอบสถานะ ฟังก์ชันแอ็กชันที่ถูกห่อหุ้ม และ isPending แอ็กชันฝั่งเซิร์ฟเวอร์จะเพิ่ม 'use server' และทำงานบนเซิร์ฟเวอร์

ถัดไป

บทเรียนถัดไป: **useOptimistic สำหรับการตอบสนองทันที** — คุณจะแสดงการอัปเดตส่วนติดต่อผู้ใช้แบบมองโลกในแง่ดีขณะที่การเปลี่ยนแปลงข้อมูลบนเซิร์ฟเวอร์กำลังดำเนินการ

คำถามที่พบบ่อย

บทเรียน “React Actions และ useActionState” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “React Actions และ useActionState” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “React Actions และ useActionState”

กำหนดแอ็กชันฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ จัดการการส่งฟอร์ม และติดตามสถานะกำลังดำเนินการ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “React Actions และ useActionState” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ทำความเข้าใจ React Server Components
  2. ฮุก use() สำหรับทรัพยากรแบบอะซิงก์
  3. React Actions และ useActionState
  4. useOptimistic สำหรับการตอบสนองทันที
← กลับไปที่ React Academy