useActionState และ useFormStatus
ใช้ useActionState เพื่อติดตามสถานะที่กำลังดำเนินการและข้อผิดพลาด และใช้ useFormStatus เพื่อปิดใช้งานปุ่มส่งระหว่างการส่งคำขอ
useActionState และ useFormStatus เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
แนะนำ useActionState
useActionState(action, initialState) คือฮุกของรีแอ็กต์ 19 ที่ครอบแอ็กชันฝั่งเซิร์ฟเวอร์เพื่อติดตามสถานะของแอ็กชันระหว่างการส่งข้อมูล ฮุกนี้รับฟังก์ชันแอ็กชันและค่าเริ่มต้นของสถานะ แล้วส่งคืนทูเพิลที่คุณใช้ควบคุมประสบการณ์ของแบบฟอร์มทั้งหมดได้
ทูเพิลผลลัพธ์
ฮุกนี้ส่งคืน [state, formAction, isPending] โดย state จะเก็บค่าที่แอ็กชันส่งคืนล่าสุด ซึ่งเริ่มต้นเป็น null หรือค่าเริ่มต้นที่คุณกำหนด ส่วน formAction คือแอ็กชันที่ถูกครอบไว้สำหรับส่งต่อให้แบบฟอร์ม และ isPending จะเป็น true ขณะที่แอ็กชันกำลังทำงานบนเซิร์ฟเวอร์
การติดตามสถานะระหว่างการส่งข้อมูล
ทุกครั้งที่ส่งแบบฟอร์ม แอ็กชันฝั่งเซิร์ฟเวอร์จะทำงาน และค่าที่ส่งคืนจะกลายเป็น state ใหม่ ในการแสดงผลครั้งแรก state จะเท่ากับ initialState วิธีนี้ช่วยให้แสดงส่วนติดต่อผู้ใช้ที่แตกต่างกันได้ง่าย โดยขึ้นอยู่กับว่าก่อนหน้านี้มีการส่งข้อมูลหรือไม่ และการส่งข้อมูลเหล่านั้นส่งคืนอะไร
การแสดงข้อผิดพลาดจากการตรวจสอบในบรรทัดเดียวกัน
หากแอ็กชันฝั่งเซิร์ฟเวอร์ส่งคืน { errors: { email: 'Invalid email' } } คุณสามารถแสดงข้อผิดพลาดในตำแหน่งนั้นได้ดังนี้: {state.errors?.email && <p>{state.errors.email}</p>} เนื่องจากสถานะยังคงอยู่ระหว่างการแสดงผลใหม่ ข้อความข้อผิดพลาดจึงยังคงแสดงจนกว่าการส่งข้อมูลครั้งถัดไปจะสำเร็จและแทนที่สถานะเดิม
การแสดงข้อความสำเร็จ
เมื่อแอ็กชันส่งคืน { success: true } คอมโพเนนต์ก็สามารถแสดงข้อความสำเร็จได้ดังนี้: {state?.success && <p>Form submitted!</p>} คุณสามารถซ่อนแบบฟอร์มหรือแทนที่ด้วยข้อความสำเร็จแบบมีเงื่อนไขตามค่าของสถานะได้
แนะนำ useFormStatus
useFormStatus() คือฮุกที่อ่านสถานะรอดำเนินการขององค์ประกอบ <form> บรรพบุรุษที่ใกล้ที่สุด ฮุกนี้ส่งคืนอ็อบเจ็กต์ที่มีค่า { pending: boolean } อยู่ด้วย ฮุกนี้ต้องใช้ภายในคอมโพเนนต์ที่เป็นลูกของแบบฟอร์ม ไม่ใช่ในคอมโพเนนต์ที่แสดงผลแบบฟอร์มเอง
เหตุผลที่จำกัดตำแหน่งการใช้งาน
ข้อจำกัดที่กำหนดให้ใช้ useFormStatus ภายในแบบฟอร์มนั้นมีอยู่ เพราะฮุกจะอ่านบริบทของแบบฟอร์มจากแผนผังรีแอ็กต์ที่อยู่ด้านบน หากเรียกใช้ในคอมโพเนนต์เดียวกับที่แสดงผลแบบฟอร์ม คอมโพเนนต์นั้นจะเป็นพี่น้องกับแบบฟอร์ม ไม่ใช่ลูกหลาน จึงไม่สามารถเข้าถึงสถานะของแบบฟอร์มได้
การสร้างคอมโพเนนต์ปุ่มส่ง
รูปแบบมาตรฐานคือแยกปุ่มส่งไปไว้ในคอมโพเนนต์ของตัวเอง: function SubmitButton() { const { pending } = useFormStatus(); return <button disabled={pending}>Submit</button>; } จากนั้นวางคอมโพเนนต์นี้ไว้ภายในแบบฟอร์ม เพื่อให้เข้าถึงสถานะรอดำเนินการของแบบฟอร์มได้
การปิดใช้งานปุ่มส่ง
การกำหนด disabled={pending} ให้กับปุ่มส่งจะป้องกันการส่งข้อมูลซ้ำ เมื่อผู้ใช้คลิกส่งและแอ็กชันฝั่งเซิร์ฟเวอร์กำลังทำงาน pending จะเป็น true ปุ่มจะถูกปิดใช้งานและไม่สามารถคลิกได้ เมื่อแอ็กชันทำงานเสร็จ pending จะกลับเป็น false และปุ่มจะเปิดใช้งานอีกครั้ง
การใช้ฮุกทั้งสองร่วมกัน
รูปแบบประสบการณ์ผู้ใช้ของแบบฟอร์มที่สมบูรณ์จะใช้ฮุกทั้งสองร่วมกัน โดย useActionState ในคอมโพเนนต์แบบฟอร์มจะติดตามผลลัพธ์ของแอ็กชันและจัดเตรียม formAction ขณะที่ useFormStatus ภายในคอมโพเนนต์ลูก SubmitButton จะติดตามสถานะรอดำเนินการ ฮุกทั้งสองร่วมกันช่วยให้แสดงข้อผิดพลาดจากการตรวจสอบและจัดเตรียมปุ่มส่งที่ตอบสนองได้ดี
ส่วนติดต่อผู้ใช้แบบมองโลกในแง่ดีด้วย useOptimistic
หากต้องการให้ตอบสนองได้ดียิ่งขึ้น useOptimistic สามารถใช้ร่วมกับ useActionState ได้ คุณจะอัปเดตส่วนติดต่อผู้ใช้ด้วยผลลัพธ์ที่คาดไว้ทันที ก่อนที่เซิร์ฟเวอร์จะตอบกลับ แล้วจึงปรับให้ตรงกันเมื่อได้รับการตอบกลับจริง รูปแบบนี้พบได้บ่อยในปุ่มถูกใจ รายการสิ่งที่ต้องทำ และการโต้ตอบอื่นที่ต้องการผลตอบกลับอย่างรวดเร็ว
ตำแหน่งการใช้ useFormStatus
ต้องเรียกใช้ useFormStatus ที่ใดจึงจะทำงานได้อย่างถูกต้อง
สรุปบทเรียน
useActionState(action, initialState) ส่งคืน [state, formAction, isPending] เพื่อติดตามผลลัพธ์ของแอ็กชันฝั่งเซิร์ฟเวอร์ สถานะจะเก็บค่าที่แอ็กชันส่งคืน ทำให้แสดงข้อผิดพลาดและข้อความสำเร็จในตำแหน่งนั้นได้ useFormStatus() จัดเตรียมค่า { pending } ภายในคอมโพเนนต์ลูกของแบบฟอร์ม ทำให้สร้างปุ่มส่งที่ตอบสนองได้ดี ฮุกทั้งสองทำงานร่วมกันเพื่อสร้างประสบการณ์การใช้แบบฟอร์มที่สมบูรณ์และเข้าถึงได้
คำถามที่พบบ่อย
บทเรียน “useActionState และ useFormStatus” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “useActionState และ useFormStatus” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “useActionState และ useFormStatus”
ใช้ useActionState เพื่อติดตามสถานะที่กำลังดำเนินการและข้อผิดพลาด และใช้ useFormStatus เพื่อปิดใช้งานปุ่มส่งระหว่างการส่งคำขอ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “useActionState และ useFormStatus” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การดำเนินการฝั่งเซิร์ฟเวอร์ในรีแอ็กต์ 19 และ Next.js
- การดำเนินการของแบบฟอร์ม: แทนที่เส้นทาง API สำหรับการเปลี่ยนแปลงข้อมูล
- useActionState และ useFormStatus
- การปรับปรุงแบบค่อยเป็นค่อยไปด้วยการดำเนินการฝั่งเซิร์ฟเวอร์