สำรวจ React experimental_useFormState hook เพื่อการจัดการสถานะฟอร์มที่มีประสิทธิภาพ เรียนรู้วิธีลดความซับซ้อนของฟอร์ม ปรับปรุงประสิทธิภาพ และจัดการการกระทำแบบอะซิงโครนัสอย่างมีประสิทธิภาพ
React experimental_useFormState: คู่มือฉบับสมบูรณ์เพื่อการจัดการฟอร์มที่ดียิ่งขึ้น
ระบบนิเวศที่พัฒนาตลอดเวลาของ React แนะนำเครื่องมือที่เป็นนวัตกรรมใหม่อย่างต่อเนื่องเพื่อปรับปรุงประสบการณ์ของนักพัฒนาและประสิทธิภาพของแอปพลิเคชัน ความก้าวหน้าอย่างหนึ่งคือ experimental_useFormState Hook Hook นี้ซึ่งปัจจุบันอยู่ในขั้นตอนการทดลอง ให้วิธีการที่ทรงพลังและคล่องตัวในการจัดการสถานะฟอร์มและการจัดการการกระทำแบบอะซิงโครนัส โดยเฉพาะอย่างยิ่งเมื่อรวมกับ React Server Components และ Actions คู่มือนี้จะเจาะลึกถึงความซับซ้อนของ experimental_useFormState สำรวจประโยชน์ กรณีการใช้งาน และกลยุทธ์การใช้งาน
experimental_useFormState คืออะไร
experimental_useFormState Hook ได้รับการออกแบบมาเพื่อลดความซับซ้อนในการจัดการฟอร์มภายในแอปพลิเคชัน React โดยนำเสนอวิธีประกาศในการจัดการสถานะฟอร์ม ข้อผิดพลาด และการส่งแบบอะซิงโครนัส ซึ่งแตกต่างจากวิธีการแบบเดิมๆ ที่มักเกี่ยวข้องกับการอัปเดตสถานะด้วยตนเองและการจัดการเหตุการณ์ที่ซับซ้อน experimental_useFormState ปรับปรุงกระบวนการนี้โดยการจัดเตรียม hook เดียวเพื่อจัดการวงจรชีวิตของฟอร์มทั้งหมด
โดยหลักแล้ว experimental_useFormState ช่วยให้คุณเชื่อมโยงค่าสถานะกับฟังก์ชันที่ดำเนินการตรรกะการส่งฟอร์ม ฟังก์ชันนี้ โดยทั่วไปคือการกระทำของเซิร์ฟเวอร์ในบริบทของ React Server Components มีหน้าที่ตรวจสอบความถูกต้องของข้อมูลและดำเนินการเปลี่ยนแปลงที่จำเป็น จากนั้น hook จะจัดการสถานะของการดำเนินการของฟังก์ชันนี้ โดยให้ข้อเสนอแนะแก่ผู้ใช้เกี่ยวกับสถานะของฟอร์ม (เช่น กำลังโหลด สำเร็จ ข้อผิดพลาด)
ประโยชน์ของการใช้ experimental_useFormState
- ตรรกะฟอร์มที่ง่ายขึ้น: ลดโค้ดสำเร็จรูปโดยรวมศูนย์การจัดการสถานะฟอร์มภายใน hook เดียว
- ประสิทธิภาพที่ดีขึ้น: เพิ่มประสิทธิภาพการเรนเดอร์โดยลดการอัปเดตที่ไม่จำเป็นและใช้ประโยชน์จากการเปลี่ยนแปลงข้อมูลฝั่งเซิร์ฟเวอร์
- แนวทางเชิงประกาศ: ส่งเสริมฐานรหัสที่อ่านได้และบำรุงรักษาได้มากขึ้นผ่านรูปแบบการเขียนโปรแกรมเชิงประกาศ
- การผสานรวมอย่างราบรื่นกับการกระทำของเซิร์ฟเวอร์: ออกแบบมาเพื่อทำงานร่วมกับ React Server Components และ Actions อย่างราบรื่น ทำให้สามารถดึงและเปลี่ยนแปลงข้อมูลได้อย่างมีประสิทธิภาพ
- ประสบการณ์ผู้ใช้ที่ได้รับการปรับปรุง: ให้ข้อเสนอแนะที่ชัดเจนและกระชับแก่ผู้ใช้เกี่ยวกับสถานะของฟอร์ม ปรับปรุงประสบการณ์ผู้ใช้โดยรวม
กรณีการใช้งานสำหรับ experimental_useFormState
experimental_useFormState Hook เหมาะอย่างยิ่งสำหรับสถานการณ์ที่เกี่ยวข้องกับฟอร์มที่ซับซ้อนซึ่งต้องมีการตรวจสอบความถูกต้องและการเปลี่ยนแปลงข้อมูลฝั่งเซิร์ฟเวอร์ ต่อไปนี้เป็นกรณีการใช้งานทั่วไปบางส่วน:
- ฟอร์มการตรวจสอบสิทธิ์: การจัดการการลงทะเบียนผู้ใช้ การเข้าสู่ระบบ และฟอร์มการรีเซ็ตรหัสผ่าน
- ฟอร์มอีคอมเมิร์ซ: การประมวลผลฟอร์มการชำระเงิน การอัปเดตโปรไฟล์ผู้ใช้ และการจัดการรายการผลิตภัณฑ์
- ระบบจัดการเนื้อหา (CMS): การสร้างและแก้ไขบทความ การจัดการบทบาทผู้ใช้ และการกำหนดค่าการตั้งค่าเว็บไซต์
- แพลตฟอร์มโซเชียลมีเดีย: การโพสต์การอัปเดต การส่งความคิดเห็น และการจัดการโปรไฟล์ผู้ใช้
- ฟอร์มป้อนข้อมูล: การจับภาพและตรวจสอบความถูกต้องของข้อมูลจากแหล่งต่างๆ เช่น แบบสำรวจ แบบฟอร์มข้อเสนอแนะ และข้อมูลลูกค้า
ตัวอย่างการใช้งาน: แบบฟอร์มติดต่ออย่างง่าย
มาแสดงให้เห็นถึงการใช้ experimental_useFormState ด้วยตัวอย่างเชิงปฏิบัติ: แบบฟอร์มติดต่ออย่างง่าย ฟอร์มนี้จะรวบรวมชื่อ อีเมล และข้อความของผู้ใช้ จากนั้นส่งข้อมูลไปยังการกระทำของเซิร์ฟเวอร์เพื่อทำการประมวลผล
1. กำหนดการกระทำของเซิร์ฟเวอร์
ขั้นแรก เราต้องกำหนดการกระทำของเซิร์ฟเวอร์ที่จัดการการส่งฟอร์ม การกระทำนี้จะตรวจสอบความถูกต้องของข้อมูลและส่งการแจ้งเตือนทางอีเมล
```javascript // app/actions.js 'use server'; import { revalidatePath } from 'next/cache'; import { sendEmail } from './utils/email'; // ตัวอย่างฟังก์ชันการส่งอีเมล export async function submitContactForm(prevState, formData) { const name = formData.get('name'); const email = formData.get('email'); const message = formData.get('message'); // การตรวจสอบความถูกต้องขั้นพื้นฐาน if (!name || !email || !message) { return 'กรุณากรอกข้อมูลในทุกช่อง'; } try { await sendEmail({ to: 'admin@example.com', // แทนที่ด้วยอีเมลผู้ดูแลระบบของคุณ subject: 'การส่งแบบฟอร์มติดต่อใหม่', text: `ชื่อ: ${name}\nอีเมล: ${email}\nข้อความ: ${message}`, }); revalidatePath('/'); // ตรวจสอบหน้าแรกหรือเส้นทางที่เกี่ยวข้องอีกครั้ง return 'ขอบคุณสำหรับข้อความของคุณ!'; } catch (error) { console.error('ข้อผิดพลาดในการส่งอีเมล:', error); return 'เกิดข้อผิดพลาด โปรดลองอีกครั้งในภายหลัง'; } } ```คำอธิบาย:
- คำสั่ง
'use server'ระบุว่าฟังก์ชันนี้ควรดำเนินการบนเซิร์ฟเวอร์ - ฟังก์ชันนี้รับสถานะก่อนหน้า (
prevState) และข้อมูลฟอร์ม (formData) เป็นอาร์กิวเมนต์ - ดึงชื่อ อีเมล และข้อความจากข้อมูลฟอร์ม
- ดำเนินการตรวจสอบความถูกต้องขั้นพื้นฐานเพื่อให้แน่ใจว่าได้กรอกข้อมูลในช่องที่จำเป็นทั้งหมดแล้ว
- ใช้ฟังก์ชันอะซิงโครนัส
sendEmail(ซึ่งคุณจะต้องนำไปใช้งานแยกกัน) เพื่อส่งการแจ้งเตือนทางอีเมล ซึ่งอาจใช้บริการเช่น SendGrid, Mailgun หรือ AWS SES revalidatePath('/')บังคับให้ Next.js ดึงข้อมูลสำหรับหน้าแรกอีกครั้ง เพื่อให้แน่ใจว่าการเปลี่ยนแปลงที่เกี่ยวข้องใดๆ จะปรากฏขึ้นทันที- ส่งคืนข้อความสำเร็จหรือข้อผิดพลาดเพื่ออัปเดตสถานะฟอร์ม
2. นำ React Component ไปใช้งาน
ตอนนี้ มาสร้าง React component ที่ใช้ experimental_useFormState เพื่อจัดการสถานะฟอร์มและจัดการการส่ง
คำอธิบาย:
- คำสั่ง
'use client'ระบุว่า component นี้เป็น client component - เรานำเข้า
experimental_useFormStateเป็นuseFormStateเพื่อความกระชับและการกระทำsubmitContactForm - เราเรียก
useFormStateโดยส่งผ่านการกระทำsubmitContactFormและสถานะเริ่มต้นเป็นnull - Hook ส่งคืนสถานะปัจจุบัน (
state) และฟังก์ชัน (formAction) ที่ทริกเกอร์การส่งฟอร์ม - เราแนบฟังก์ชัน
formActionกับพร็อพactionขององค์ประกอบformนี่เป็นสิ่งสำคัญเพื่อให้ React จัดการการส่งฟอร์มได้อย่างถูกต้อง - ฟอร์มประกอบด้วยช่องป้อนข้อมูลสำหรับชื่อ อีเมล และข้อความ รวมถึงปุ่มส่ง
- บรรทัด
{state && <p>{state}</p>}แสดงสถานะปัจจุบัน (ข้อความสำเร็จหรือข้อผิดพลาด) ให้กับผู้ใช้
3. การตั้งค่าบริการส่งอีเมลของคุณ (ตัวอย่าง sendEmail)
คุณจะต้องนำฟังก์ชัน sendEmail ไปใช้งาน นี่คือตัวอย่างการใช้ Nodemailer กับบัญชี Gmail (หมายเหตุ: โดยทั่วไปไม่แนะนำให้ใช้ Gmail โดยตรงในการผลิต ใช้บริการอีเมลเฉพาะ เช่น SendGrid, Mailgun หรือ AWS SES สำหรับสภาพแวดล้อมการผลิต):
หมายเหตุความปลอดภัยที่สำคัญ: อย่า commit รหัสผ่าน Gmail จริงของคุณไปยังฐานรหัสของคุณโดยตรง! ใช้ตัวแปรสภาพแวดล้อมเพื่อจัดเก็บข้อมูลที่ละเอียดอ่อน สำหรับการใช้งานจริง ให้สร้างรหัสผ่านแอปโดยเฉพาะสำหรับ Nodemailer และหลีกเลี่ยงการใช้รหัสผ่าน Gmail หลักของคุณ บริการส่งอีเมลโดยเฉพาะมีอัตราการส่งมอบและความปลอดภัยที่ดีกว่าเมื่อเทียบกับการใช้ Gmail โดยตรง
4. การรันตัวอย่าง
ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง dependencies ที่จำเป็น:
```bash npm install nodemailer ```หรือ
```bash yarn add nodemailer ```จากนั้น รัน Next.js development server ของคุณ:
```bash npm run dev ```หรือ
```bash yarn dev ```เปิดเบราว์เซอร์ของคุณและนำทางไปยังหน้าที่ประกอบด้วย component ContactForm กรอกฟอร์มและส่ง คุณควรเห็นข้อความสำเร็จหรือข้อความแสดงข้อผิดพลาดที่แสดงอยู่ใต้ฟอร์ม ตรวจสอบกล่องจดหมายอีเมลของคุณเพื่อตรวจสอบว่าส่งอีเมลสำเร็จหรือไม่
การใช้งานและการพิจารณาขั้นสูง
1. การจัดการสถานะการโหลด
เพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ดีขึ้น สิ่งสำคัญคือต้องระบุเมื่อฟอร์มกำลังส่ง ในขณะที่ experimental_useFormState ไม่ได้เปิดเผยสถานะการโหลดโดยตรง คุณสามารถจัดการได้ด้วยตนเองโดยใช้ React's useTransition hook ร่วมกับการ formAction
ในตัวอย่างนี้:
- เรานำเข้า
useTransitionจาก 'react' - เราเรียก
useTransitionเพื่อรับสถานะisPendingและฟังก์ชันstartTransition - เราครอบการเรียกไปยัง
formActionภายในstartTransitionสิ่งนี้จะบอกให้ React ถือว่าการส่งฟอร์มเป็นการเปลี่ยนภาพ ทำให้สามารถถูกขัดจังหวะได้หากจำเป็น - เราปิดใช้งานปุ่มส่งในขณะที่
isPendingเป็นจริงและเปลี่ยนข้อความปุ่มเป็น "กำลังส่ง..."
2. การจัดการข้อผิดพลาดและการตรวจสอบความถูกต้อง
การจัดการข้อผิดพลาดที่แข็งแกร่งเป็นสิ่งสำคัญสำหรับการมอบประสบการณ์ที่ดีแก่ผู้ใช้ การกระทำของเซิร์ฟเวอร์ควรดำเนินการตรวจสอบความถูกต้องอย่างละเอียดและส่งคืนข้อความแสดงข้อผิดพลาดที่ให้ข้อมูลแก่ไคลเอนต์ จากนั้นไคลเอนต์ component สามารถแสดงข้อความเหล่านี้ให้ผู้ใช้ได้
การตรวจสอบความถูกต้องฝั่งเซิร์ฟเวอร์: ตรวจสอบความถูกต้องของข้อมูลบนเซิร์ฟเวอร์เสมอเพื่อป้องกันอินพุตที่เป็นอันตรายและรับประกันความสมบูรณ์ของข้อมูล ใช้ไลบรารีเช่น Zod หรือ Yup สำหรับการตรวจสอบความถูกต้องของ schema
การตรวจสอบความถูกต้องฝั่งไคลเอ็นต์ (ไม่บังคับ): ในขณะที่การตรวจสอบความถูกต้องฝั่งเซิร์ฟเวอร์มีความสำคัญ การตรวจสอบความถูกต้องฝั่งไคลเอ็นต์สามารถให้ข้อเสนอแนะแก่ผู้ใช้ได้ทันทีและปรับปรุงประสบการณ์ผู้ใช้ อย่างไรก็ตาม ไม่ควรพึ่งพาการตรวจสอบความถูกต้องฝั่งไคลเอ็นต์เป็นแหล่งความจริงเพียงแหล่งเดียว
3. การอัปเดตแบบ Optimistic
การอัปเดตแบบ Optimistic สามารถทำให้แอปพลิเคชันของคุณรู้สึกตอบสนองได้ดีขึ้นโดยการอัปเดต UI ทันทีราวกับว่าการส่งฟอร์มสำเร็จ แม้กระทั่งก่อนที่เซิร์ฟเวอร์จะยืนยัน อย่างไรก็ตาม เตรียมพร้อมที่จะจัดการข้อผิดพลาดและยกเลิกการเปลี่ยนแปลงหากการส่งล้มเหลว
ด้วย experimental_useFormState คุณสามารถนำการอัปเดตแบบ Optimistic ไปใช้งานได้โดยการอัปเดตสถานะโลคัลตามข้อมูลฟอร์มก่อนที่จะเรียก formAction หากการกระทำของเซิร์ฟเวอร์ล้มเหลว คุณสามารถยกเลิกการเปลี่ยนแปลงตามข้อความแสดงข้อผิดพลาดที่ hook ส่งคืน
4. การตรวจสอบความถูกต้องอีกครั้งและการแคช
React Server Components และ Actions ใช้ประโยชน์จากการแคชเพื่อปรับปรุงประสิทธิภาพ เมื่อการส่งฟอร์มแก้ไขข้อมูล สิ่งสำคัญคือต้องตรวจสอบแคชอีกครั้งเพื่อให้แน่ใจว่า UI สะท้อนถึงการเปลี่ยนแปลงล่าสุด
ฟังก์ชัน revalidatePath และ revalidateTag จาก next/cache สามารถใช้เพื่อทำให้บางส่วนของแคชเป็นโมฆะ ในตัวอย่าง submitContactForm มีการใช้ revalidatePath('/') เพื่อตรวจสอบหน้าแรกอีกครั้งหลังจากการส่งฟอร์มสำเร็จ
5. Internationalization (i18n)
เมื่อสร้างแอปพลิเคชันสำหรับผู้ชมทั่วโลก Internationalization (i18n) เป็นสิ่งสำคัญ ซึ่งเกี่ยวข้องกับการปรับแอปพลิเคชันของคุณให้เข้ากับภาษา ภูมิภาค และความชอบทางวัฒนธรรมที่แตกต่างกัน
สำหรับฟอร์ม หมายถึงการจัดเตรียมป้ายกำกับ ข้อความแสดงข้อผิดพลาด และกฎการตรวจสอบความถูกต้องที่เป็นภาษาท้องถิ่น ใช้ไลบรารี i18n เช่น next-intl หรือ react-i18next เพื่อจัดการการแปลและจัดรูปแบบข้อมูลตาม locale ของผู้ใช้
ตัวอย่างการใช้ next-intl:
6. การเข้าถึง (a11y)
การเข้าถึงเป็นสิ่งสำคัญเพื่อให้แน่ใจว่าทุกคนสามารถใช้แอปพลิเคชันของคุณได้ รวมถึงผู้พิการ พิจารณาหลักเกณฑ์การเข้าถึงต่อไปนี้เมื่อสร้างฟอร์ม:
- ใช้ HTML เชิงความหมาย: ใช้องค์ประกอบ HTML ที่เหมาะสม เช่น
<label>,<input>และ<textarea>เพื่อจัดโครงสร้างและความหมายให้กับฟอร์มของคุณ - จัดเตรียมป้ายกำกับสำหรับทุกช่องฟอร์ม: เชื่อมโยงป้ายกำกับกับช่องฟอร์มโดยใช้แอตทริบิวต์
forบนองค์ประกอบ<label>และแอตทริบิวต์idบนช่องฟอร์ม - ใช้แอตทริบิวต์ ARIA: ใช้แอตทริบิวต์ ARIA เพื่อให้ข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างและลักษณะการทำงานของฟอร์มแก่เทคโนโลยีอำนวยความสะดวก
- ตรวจสอบให้แน่ใจว่ามีคอนทราสต์สีเพียงพอ: ใช้คอนทราสต์สีที่เพียงพอระหว่างข้อความและสีพื้นหลังเพื่อให้แน่ใจว่าสามารถอ่านได้สำหรับผู้ที่มีความบกพร่องทางสายตา
- จัดเตรียมการนำทางด้วยคีย์บอร์ด: ตรวจสอบให้แน่ใจว่าผู้ใช้สามารถนำทางฟอร์มโดยใช้คีย์บอร์ดเพียงอย่างเดียว
- ทดสอบด้วยเทคโนโลยีอำนวยความสะดวก: ทดสอบฟอร์มของคุณด้วยเทคโนโลยีอำนวยความสะดวก เช่น โปรแกรมอ่านหน้าจอ เพื่อให้แน่ใจว่าผู้พิการสามารถเข้าถึงได้
ข้อควรพิจารณาและแนวทางปฏิบัติที่ดีที่สุดระดับโลก
1. เขตเวลา
เมื่อจัดการกับวันที่และเวลาในฟอร์ม สิ่งสำคัญคือต้องพิจารณาเขตเวลา จัดเก็บวันที่และเวลาในรูปแบบ UTC บนเซิร์ฟเวอร์และแปลงเป็นเขตเวลาท้องถิ่นของผู้ใช้บนไคลเอนต์
2. สกุลเงิน
เมื่อจัดการกับค่าเงินในฟอร์ม สิ่งสำคัญคือต้องจัดการสกุลเงินอย่างถูกต้อง ใช้ไลบรารีการจัดรูปแบบสกุลเงินเพื่อจัดรูปแบบค่าตาม locale ของผู้ใช้และแสดงสัญลักษณ์สกุลเงินที่เหมาะสม
3. ที่อยู่
รูปแบบที่อยู่แตกต่างกันอย่างมากในแต่ละประเทศ ใช้ไลบรารีที่รองรับรูปแบบที่อยู่ระหว่างประเทศเพื่อให้แน่ใจว่าผู้ใช้สามารถป้อนที่อยู่ได้อย่างถูกต้อง
4. หมายเลขโทรศัพท์
รูปแบบหมายเลขโทรศัพท์ก็แตกต่างกันไปในแต่ละประเทศเช่นกัน ใช้ไลบรารีการจัดรูปแบบหมายเลขโทรศัพท์เพื่อจัดรูปแบบหมายเลขโทรศัพท์ตาม locale ของผู้ใช้และตรวจสอบว่าหมายเลขโทรศัพท์เหล่านั้นถูกต้อง
5. ความเป็นส่วนตัวของข้อมูลและการปฏิบัติตามข้อกำหนด
โปรดคำนึงถึงกฎระเบียบด้านความเป็นส่วนตัวของข้อมูล เช่น GDPR และ CCPA เมื่อรวบรวมและประมวลผลข้อมูลฟอร์ม ขอความยินยอมจากผู้ใช้ก่อนที่จะรวบรวมข้อมูลและให้ความสามารถในการเข้าถึง แก้ไข และลบข้อมูล
บทสรุป
experimental_useFormState Hook นำเสนอแนวทางที่มีแนวโน้มในการลดความซับซ้อนในการจัดการฟอร์มในแอปพลิเคชัน React ด้วยการใช้ประโยชน์จากการกระทำของเซิร์ฟเวอร์และการยอมรับสไตล์เชิงประกาศ นักพัฒนาสามารถสร้างฟอร์มที่มีประสิทธิภาพ บำรุงรักษาได้ และใช้งานง่ายมากขึ้น ในขณะที่ยังอยู่ในขั้นตอนการทดลอง experimental_useFormState มีศักยภาพอย่างมากในการปรับปรุงขั้นตอนการทำงานของฟอร์มและปรับปรุงประสบการณ์การพัฒนา React โดยรวม ด้วยการปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดที่สรุปไว้ในคู่มือนี้ คุณสามารถควบคุมพลังของ experimental_useFormState ได้อย่างมีประสิทธิภาพเพื่อสร้างโซลูชันฟอร์มที่แข็งแกร่งและปรับขนาดได้สำหรับแอปพลิเคชันของคุณ
อย่าลืมอัปเดตอยู่เสมอด้วยเอกสารประกอบ React ล่าสุดและการสนทนาในชุมชนเมื่อ API พัฒนาจาก experimental เป็น stable