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

Server Actions สำหรับการเปลี่ยนแปลงข้อมูล

กำหนดฟังก์ชัน 'use server' เพื่อจัดการ mutation ของฟอร์ม และทำให้แคชเป็นโมฆะด้วย revalidatePath

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

Server Actions คืออะไร

Server Actions คือฟังก์ชันอะซิงโครนัสที่ระบุด้วย 'use server' และทำงานเฉพาะบนเซิร์ฟเวอร์ ฟังก์ชันเหล่านี้ช่วยให้ส่งฟอร์มและเปลี่ยนแปลงข้อมูลได้โดยไม่ต้องเขียนตัวจัดการเส้นทาง API

กำหนด Server Action

เพิ่ม 'use server' ไว้ด้านบนของฟังก์ชัน (หรือไฟล์) เพื่อสร้าง Server Action โดยสามารถกำหนดได้เฉพาะในคอมโพเนนต์ฝั่งเซิร์ฟเวอร์หรือในไฟล์ 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');
}

ใช้ Actions ในฟอร์ม

ส่งฟังก์ชัน 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 ในตัวจัดการเหตุการณ์

เรียกใช้ Server Actions จากตัวจัดการเหตุการณ์ของคอมโพเนนต์ฝั่งไคลเอนต์ได้ ไม่ใช่เฉพาะจาก action ของฟอร์ม โดยนำเข้าและเรียกใช้โดยตรง

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

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

Server Actions แบบอินไลน์

กำหนด Server Actions แบบอินไลน์ในคอมโพเนนต์ฝั่งเซิร์ฟเวอร์ โดยใช้ฟังก์ชันที่มี 'use server' อยู่ภายใน ซึ่งมีประโยชน์สำหรับตรรกะการเปลี่ยนแปลงข้อมูลที่อยู่ร่วมกับส่วนที่เรียกใช้

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>
  );
}

ใช้ useOptimistic กับ Server Actions

จับคู่ useOptimistic กับ Server Actions เพื่ออัปเดตส่วนติดต่อผู้ใช้ทันทีขณะที่ action ทำงานอยู่ในเบื้องหลัง

'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() หลังการเปลี่ยนแปลงข้อมูล เพื่อล้างแคชที่เกี่ยวข้อง ทำให้การโหลดหน้าครั้งถัดไปสะท้อนการเปลี่ยนแปลง

ตรวจสอบความเข้าใจ

คุณส่ง Server Action ให้ฟอร์มใน Next.js App Router ได้อย่างไร

สรุป

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

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

บทเรียน “Server Actions สำหรับการเปลี่ยนแปลงข้อมูล” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “Server Actions สำหรับการเปลี่ยนแปลงข้อมูล”

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

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

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

บทเรียน “Server Actions สำหรับการเปลี่ยนแปลงข้อมูล” ใช้เวลานานแค่ไหน

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

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

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

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

  1. fetch() พร้อมตัวเลือกแคชใน Next.js
  2. unstable_cache และ React cache()
  3. การสร้างสถิตแบบเพิ่มทีละส่วน (ISR)
  4. Server Actions สำหรับการเปลี่ยนแปลงข้อมูล
← กลับไปที่ React Academy