🔵 React

เจาะลึก React 19 Actions และ useActionState จัดการฟอร์มให้ง่ายและสะอาดกว่าเดิม

8 นาที 21 views บันทึกเป็น PDF
เจาะลึก React 19 Actions และ useActionState จัดการฟอร์มให้ง่ายและสะอาดกว่าเดิม

เรียนรู้การจัดการฟอร์มใน React 19 ด้วย Actions และ useActionState ช่วยลดโค้ดที่ซับซ้อน จัดการสถานะ Loading ได้ง่ายขึ้น เหมาะสำหรับมือใหม่ที่อยากเขียนโค้ดให้เป็นมืออาชีพ

ทำความรู้จักกับ React 19 Actions และความสำคัญของมัน

ในการพัฒนาเว็บด้วย React การจัดการข้อมูลจากฟอร์ม (Form) มักเป็นเรื่องที่น่าปวดหัวสำหรับมือใหม่ เพราะเราต้องคอยจดจำสถานะ (State) ของแต่ละช่องกรอกข้อมูล รวมถึงต้องเขียนฟังก์ชันเพื่อจัดการเหตุการณ์ (Event Handler) เมื่อผู้ใช้กดปุ่มส่งข้อมูล React 19 Actions จึงถูกออกแบบมาเพื่อแก้ปัญหาความวุ่นวายนี้ โดยเปลี่ยนวิธีการส่งข้อมูลให้เป็นธรรมชาติและง่ายขึ้นมาก

ลองนึกภาพว่าการส่งข้อมูลฟอร์มแบบเดิมเหมือนกับการที่คุณต้องจดบันทึกทุกขั้นตอนที่ลูกค้าสั่งอาหาร ตั้งแต่จดชื่อ จดเมนู ไปจนถึงยืนยันรายการด้วยตัวเองทุกครั้ง แต่ระบบ Actions เปรียบเสมือนการมีพนักงานเสิร์ฟที่รับออเดอร์และส่งต่อไปยังห้องครัวให้โดยอัตโนมัติ เมื่อเราใช้ Actions เราเพียงแค่บอกว่า "เมื่อกดปุ่มนี้ ให้ทำฟังก์ชันนี้" แล้ว React จะจัดการส่วนที่เหลือให้เองทั้งหมด

การเข้าใจเรื่องนี้สำคัญมากสำหรับคนที่กำลังจะเป็นโปรแกรมเมอร์ เพราะมันช่วยลดจำนวนโค้ดที่คุณต้องเขียนลงไปได้มหาศาล และยังช่วยให้การจัดการ Asynchronous operations (การทำงานที่ไม่รอให้เสร็จทันที เช่น การบันทึกข้อมูลลงฐานข้อมูล) เป็นเรื่องที่สะอาดตาขึ้น การฝึกใช้เครื่องมือใหม่ที่ทันสมัยจะทำให้โปรเจกต์ของคุณดูเป็นมืออาชีพและบำรุงรักษาได้ง่ายในระยะยาว

ความแตกต่างระหว่างวิธีเดิมกับ React 19 Actions

ในรูปแบบเดิม เรามักจะใช้ useState เพื่อเก็บค่าจากช่อง Input ทุกช่อง และใช้ onSubmit เพื่อดึงค่าเหล่านั้นไปใช้งาน ซึ่งมักนำไปสู่โค้ดที่ยาวเกินความจำเป็นและจัดการสถานะระหว่างการโหลดข้อมูลได้ยาก นอกจากนี้เรายังต้องเขียนโค้ดเพื่อจัดการสถานะการส่งข้อมูล (Loading state) เองทั้งหมด ซึ่งเสี่ยงต่อการเกิดบั๊กได้ง่าย

วิธีใหม่ที่ React 19 นำเสนอคือการใช้ฟังก์ชันที่ทำหน้าที่เป็น Action โดยตรงกับแท็ก <form action={...}> ทำให้เราไม่ต้องคอยจัดการ onChange ในทุกช่องข้อมูลอีกต่อไป ฟังก์ชันนี้สามารถทำงานแบบ Async (ไม่รอให้จบคำสั่งอื่น) ได้ในตัว ซึ่งช่วยให้เราจัดการขั้นตอนการบันทึกข้อมูลได้สะดวกขึ้นกว่าเดิมอย่างมาก

ข้อควรระวังสำหรับมือใหม่คือ อย่าพยายามเปลี่ยนทุกอย่างเป็น Actions ทันทีหากคุณยังไม่เข้าใจพื้นฐาน useState เพราะการเรียนรู้เครื่องมือใหม่ต้องควบคู่ไปกับการเข้าใจหลักการทำงานเบื้องหลัง หากคุณเข้าใจว่าเหตุใดวิธีใหม่ถึงดีกว่า คุณจะสามารถประยุกต์ใช้มันในสถานการณ์ที่เหมาะสมได้ดีขึ้นกว่าการจำแค่รูปแบบโค้ดไปใช้

เริ่มต้นใช้งาน useActionState เพื่อจัดการสถานะฟอร์ม

useActionState เป็น Hook ใหม่ที่เข้ามาช่วยจัดการสถานะของฟอร์มโดยเฉพาะ มันช่วยให้เราติดตามได้ง่ายขึ้นว่าตอนนี้ฟอร์มกำลัง "ส่งข้อมูลอยู่" (Pending) หรือ "ส่งสำเร็จแล้ว" โดยตัว Hook จะคืนค่าสถานะปัจจุบันและฟังก์ชันสำหรับการสั่งงานมาให้เราใช้งานทันที

ลองดูตัวอย่างการเปรียบเทียบระหว่างวิธีเดิมที่ซับซ้อน กับการใช้ useActionState ที่เรียบง่ายกว่าด้านล่างนี้ โดยสังเกตว่าเราแทบไม่ต้องสร้าง useState แยกย่อยสำหรับแต่ละช่องกรอกข้อมูลเลย แต่เราใช้ความสามารถของ FormData (วัตถุที่ใช้รวบรวมค่าจากฟอร์ม) เข้ามาช่วยแทน

// ตัวอย่างการใช้ useActionState
import { useActionState } from 'react';

function submitAction(prevState, formData) {
  // จำลองการบันทึกข้อมูล
  const name = formData.get('username');
  return `สวัสดีคุณ ${name}!`;
}

function MyForm() {
  // state คือค่าผลลัพธ์, formAction คือฟังก์ชันส่งฟอร์ม, isPending คือสถานะการทำงาน
  const [state, formAction, isPending] = useActionState(submitAction, null);

  return (
    <form action={formAction}>
      <input name="username" />
      <button type="submit" disabled={isPending}>
        {isPending ? 'กำลังบันทึก...' : 'ส่งข้อมูล'}
      </button>
      <p>{state}</p>
    </form>
  );
}

จากโค้ดข้างต้น submitAction คือฟังก์ชันที่ทำงานเมื่อฟอร์มถูกส่ง formAction คือตัวเชื่อมที่ส่งไปยังฟอร์มโดยตรง และ isPending คือค่า Boolean (จริงหรือเท็จ) ที่บอกว่าระบบกำลังทำงานอยู่หรือไม่ ซึ่งช่วยให้เราทำปุ่ม "กำลังบันทึก" ได้ทันทีโดยไม่ต้องเขียนโค้ดเพิ่ม

ขั้นตอนการนำไปใช้จริงในโปรเจกต์ของคุณ

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

  1. เตรียมโครงสร้างฟอร์ม: เปลี่ยนการใช้ onSubmit เป็น action ในแท็ก <form> ของคุณ
  2. สร้าง Action Function: เขียนฟังก์ชันที่รับ FormData เป็นพารามิเตอร์ตัวที่สอง ซึ่งจะช่วยให้คุณดึงข้อมูลได้ง่ายผ่านคำสั่ง formData.get('ชื่อช่อง')
  3. ผูกกับ useActionState: นำฟังก์ชันนั้นมาใส่ใน Hook เพื่อรับค่าสถานะ isPending มาใช้ควบคุมปุ่มกด

ผลลัพธ์ที่คุณควรเห็นคือ โค้ดที่สั้นลงอย่างเห็นได้ชัด และปุ่มกดของคุณจะทำงานได้อย่างราบรื่นในขณะที่กำลังบันทึกข้อมูล หากคุณพบว่าข้อมูลไม่ถูกส่ง ให้ตรวจสอบว่าในแท็ก <input> ของคุณมีการระบุ name ที่ตรงกับในฟังก์ชัน formData.get หรือไม่

จุดที่มือใหม่มักพลาดและวิธีแก้ไข

ข้อผิดพลาดที่พบบ่อยที่สุดคือการลืมใส่ name attribute ให้กับแท็ก <input> ซึ่งส่งผลให้ formData ไม่สามารถดึงค่าที่ต้องการออกมาได้ หรือการลืมจัดการสถานะ Loading ทำให้ผู้ใช้กดปุ่มซ้ำหลายครั้งในขณะที่ระบบกำลังประมวลผลอยู่ ซึ่งอาจนำไปสู่การบันทึกข้อมูลซ้ำซ้อนในฐานข้อมูล

อีกจุดหนึ่งคือการเข้าใจผิดว่า useActionState จะเปลี่ยนหน้าจอทันทีโดยไม่มีการรอ หากคุณทำงานกับฐานข้อมูลจริงๆ อย่าลืมใส่ Async/Await เข้าไปในฟังก์ชัน Action เพื่อให้ React รอจนกว่าข้อมูลจะบันทึกสำเร็จ แล้วค่อยแสดงผลลัพธ์ที่ถูกต้องออกมาให้ผู้ใช้งานเห็น

หากคุณเจอ Error เกี่ยวกับ Hydration (ความไม่ตรงกันของ UI ระหว่าง Server และ Client) ให้ตรวจสอบว่าคุณได้ใช้ Hook นี้ภายใน Client Component อย่างถูกต้องหรือไม่ การหมั่นเช็ค Console ใน Browser จะช่วยให้คุณเห็นข้อความแจ้งเตือนที่ชัดเจนขึ้น ซึ่งเป็นทักษะสำคัญของโปรแกรมเมอร์มืออาชีพทุกคน

สรุป: การนำไปใช้จริงในงานเขียนโปรแกรม

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

สมมติว่าคุณกำลังทำโปรเจกต์สมุดบันทึกส่วนตัว แทนที่คุณจะต้องเขียนโค้ด 50 บรรทัดเพื่อจัดการสถานะ Input และการกดส่ง คุณสามารถใช้ useActionState เพื่อจัดการทั้งเรื่องการบันทึกข้อมูล และการแสดงข้อความแจ้งเตือน "บันทึกสำเร็จแล้ว" ได้ภายในโค้ดไม่ถึง 20 บรรทัด

จงเริ่มฝึกฝนด้วยการสร้างฟอร์มเล็กๆ เช่น ฟอร์มล็อกอิน หรือฟอร์มเพิ่มรายชื่อเพื่อน เพื่อให้คุ้นเคยกับการส่งข้อมูลผ่าน FormData ยิ่งคุณทำโปรเจกต์ขนาดเล็กบ่อยเท่าไหร่ คุณจะยิ่งเห็นภาพชัดเจนว่าความเรียบง่ายนี้จะกลายเป็นอาวุธสำคัญเมื่อคุณต้องรับผิดชอบโปรเจกต์ขนาดใหญ่ในอนาคต

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

สอนวิธี Build และ Deploy โปรเจกต์ React ขึ้นเว็บจริงด้วย Vercel และ Netlify
React

สอนวิธี Build และ Deploy โปรเจกต์ React ขึ้นเว็บจริงด้วย Vercel และ Netlify

เรียนรู้วิธีเตรียมโปรเจกต์ React ให้พร้อมใช้งานจริงผ่านคำสั่ง npm run build จัดการไฟล์ .env ให้ปลอดภัย และขั้นตอนการ Deploy ขึ้น Vercel แบบมือโปร

1 month ago 8 นาที
20 views
React Workshop Part 2: สอนจัดการ State, ดึงข้อมูล API และทำระบบ CRUD แบบมืออาชีพ
React

React Workshop Part 2: สอนจัดการ State, ดึงข้อมูล API และทำระบบ CRUD แบบมืออาชีพ

เรียนรู้การใช้ State และ useEffect ใน React เพื่อดึงข้อมูลจาก API พร้อมฝึกทำระบบตะกร้าสินค้าด้วย CRUD เพื่อให้เว็บของคุณโต้ตอบกับผู้ใช้งานได้จริง

1 month ago 8 นาที
24 views
สอนเขียน React เบื้องต้น: ออกแบบโครงสร้างแอปและสร้าง Component อย่างมืออาชีพ
React

สอนเขียน React เบื้องต้น: ออกแบบโครงสร้างแอปและสร้าง Component อย่างมืออาชีพ

เรียนรู้วิธีวางโครงสร้างแอป React แบบมือโปรด้วยการแบ่ง Component ช่วยให้โค้ดสะอาด จัดการง่าย และนำกลับมาใช้ซ้ำได้ พร้อมตัวอย่างการส่งข้อมูลผ่าน Props

1 month ago 6 นาที
11 views