😎 React TypeScript

ทำ Optimistic UI ให้แอปลื่นไหลด้วย React 19 และ TypeScript

5 นาที 19 views บันทึกเป็น PDF
ทำ Optimistic UI ให้แอปลื่นไหลด้วย React 19 และ TypeScript

อยากให้แอปตอบสนองไวเหมือนแอปดังๆ ไหม? มาเรียนรู้วิธีใช้ useOptimistic ใน React 19 เพื่อจัดการข้อมูลชั่วคราวให้ผู้ใช้รู้สึกว่าแอปเร็วทันใจแบบมือโปร

Optimistic UI คืออะไร ทำไมต้องแคร์?

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

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

สำหรับมือใหม่ React 19 ได้เพิ่มเครื่องมือที่ชื่อว่า useOptimistic เข้ามาช่วยจัดการเรื่องนี้ให้ง่ายขึ้นมาก มันช่วยให้เราสลับสถานะหน้าจอไปมาได้อย่างปลอดภัย โดยไม่ต้องเขียนโค้ดซับซ้อนเพื่อเช็คสถานะเองทั้งหมดเหมือนสมัยก่อน

รู้จักกับ useOptimistic และการเตรียมพร้อม

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

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

การใช้ TypeScript (ภาษาที่เพิ่มกฎเกณฑ์ให้ JavaScript ช่วยป้องกันข้อผิดพลาด) เข้ามาคุม จะช่วยให้เรามั่นใจว่าข้อมูลที่เราส่งเข้าไปใน useOptimistic นั้นถูกต้องตามโครงสร้างที่กำหนดไว้ ไม่เกิดบั๊ก (ข้อผิดพลาดของโปรแกรม) ตอนรันจริง

import { useOptimistic } from 'react';

// สมมติว่าเรามีรายการข้อความ
const [optimisticMessages, addOptimisticMessage] = useOptimistic(
  messages, // ข้อมูลจริงปัจจุบัน
  (state, newMessage) => [...state, { text: newMessage, pending: true }] // วิธีอัปเดตหน้าจอชั่วคราว
);

จากโค้ดข้างต้น optimisticMessages คือตัวแปรที่เราเอาไปใช้แสดงบนหน้าจอ ส่วน addOptimisticMessage คือฟังก์ชันที่เราเรียกใช้เมื่อผู้ใช้กดส่งข้อมูลใหม่ โดยเราจะตั้งค่า pending (สถานะกำลังรอ) เพื่อบอกว่านี่คือข้อมูลที่ยังไม่ยืนยัน

ใช้งานร่วมกับ useActionState เพื่อความปลอดภัย

ใน React 19 เรามักใช้ useActionState (ฟังก์ชันจัดการสถานะจากการทำงานของฟอร์ม) คู่กับ useOptimistic เพื่อให้ระบบจัดการทั้งการส่งข้อมูลและการแสดงผลครบวงจร

ขั้นตอนการทำงานมีดังนี้:

  1. ผู้ใช้กดปุ่มส่งข้อมูล
  2. เราเรียก addOptimisticMessage เพื่อโชว์ข้อมูลบนหน้าจอทันที
  3. เราส่งข้อมูลไปที่เซิร์ฟเวอร์ผ่าน useActionState
  4. เมื่อเซิร์ฟเวอร์ตอบกลับมา ถ้าสำเร็จก็ไม่ต้องทำอะไรเพิ่ม แต่ถ้าพลาด เราต้องลบข้อมูลชั่วคราวนั้นออก

วิธีนี้จะ ปลอดภัยที่สุด เพราะเรามีการแยกส่วนระหว่าง "สิ่งที่ผู้ใช้เห็น" กับ "ผลลัพธ์จากฐานข้อมูลจริง" ทำให้แอปของเราไม่พังแม้การเชื่อมต่ออินเทอร์เน็ตจะมีปัญหา

ข้อควรระวังสำหรับโปรแกรมเมอร์มือใหม่

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

คำแนะนำคือต้องมีการแจ้งเตือน (Toast Notification) หรือข้อความบอกผู้ใช้เสมอ หากการอัปเดตนั้นไม่สำเร็จ การทำแบบนี้จะช่วยสร้างประสบการณ์ใช้งานที่ดี และทำให้แอปของคุณดูเป็นมืออาชีพมากขึ้น

อย่าลืมทำความเข้าใจ เรื่องของ Async/Await (การเขียนโค้ดเพื่อรอรับข้อมูลจากภายนอก) ให้แม่นยำ เพราะการดึงข้อมูลจากฐานข้อมูลต้องใช้เวลา การเข้าใจจังหวะเวลา (Timing) จะช่วยให้คุณเขียน Optimistic UI ได้สมบูรณ์แบบ

สรุป: เอาไปใช้จริงในโปรเจกต์อย่างไร

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

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

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

แชร์บทความ

Facebook X LINE

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

วิธีเช็ก Type ด้วย tsc --noEmit และตั้งค่า Environment Variables ใน React TypeScript ก่อน Deploy
React TypeScript

วิธีเช็ก Type ด้วย tsc --noEmit และตั้งค่า Environment Variables ใน React TypeScript ก่อน Deploy

ไม่อยากให้แอปพังตอน Deploy ต้องอ่าน! สอนวิธีใช้ tsc --noEmit ตรวจสอบข้อผิดพลาดในโปรเจกต์ React TypeScript พร้อมวิธีตั้งค่า Environment Variables ให้ปลอดภัย

1 month ago 8 นาที
23 views
React TypeScript Workshop: จัดการ State, Form และ API ให้ปลอดภัยแบบมือโปร
React TypeScript

React TypeScript Workshop: จัดการ State, Form และ API ให้ปลอดภัยแบบมือโปร

เรียนรู้วิธีเขียน React ด้วย TypeScript ให้โค้ดสะอาดและลดบั๊ก ตั้งแต่การจัดการ Form ด้วย React Hook Form ไปจนถึงการดึงข้อมูล API และทำ Global State แบบ Type Safe

1 month ago 8 นาที
26 views
React TypeScript Workshop: เริ่มต้นเขียนโค้ดแบบมือโปรด้วย Type-First Architecture
React TypeScript

React TypeScript Workshop: เริ่มต้นเขียนโค้ดแบบมือโปรด้วย Type-First Architecture

อยากเขียน React ให้เก่งและบั๊กน้อยลงไหม? มาเรียนรู้วิธีวางโครงสร้างข้อมูล (Type-First) และสร้าง UI Component ที่นำกลับมาใช้ใหม่ได้จริง

1 month ago 7 นาที
24 views