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

useTransition สำหรับการอัปเดต UI แบบไม่บล็อก

ห่อการอัปเดตสถานะที่ใช้ทรัพยากรมากด้วย startTransition เพื่อให้ UI ยังคงตอบสนองได้ดี

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

ยินดีต้อนรับ

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

ปัญหาการอัปเดตที่บล็อกการทำงาน

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

โหมดการเรนเดอร์พร้อมกันของ React

React 18 เปิดตัวการเรนเดอร์พร้อมกัน โดย React สามารถเริ่มเรนเดอร์การอัปเดตสถานะ หยุดชั่วคราว และจัดลำดับความสำคัญให้การอัปเดตที่เร่งด่วนกว่า เช่น การพิมพ์ useTransition คือฮุกที่ช่วยให้คุณจัดประเภทการอัปเดตเป็นการเปลี่ยนผ่านที่มีลำดับความสำคัญต่ำ

พื้นฐานของ useTransition

useTransition ส่งคืน `[isPending, startTransition]` ให้ห่อการอัปเดตสถานะที่ไม่เร่งด่วนไว้ภายใน `startTransition()` React จะจัดลำดับความสำคัญให้การอัปเดตอื่น ๆ เช่น ช่องป้อนข้อมูลที่ควบคุมด้วยสถานะ อยู่เหนือการเปลี่ยนผ่าน
const [isPending, startTransition] = useTransition();

const handleChange = (e) => {
  setInputValue(e.target.value); // urgent: update input immediately
  startTransition(() => {
    setFilteredList(filter(e.target.value)); // non-urgent
  });
};

ใช้ isPending แสดงส่วนติดต่อขณะโหลด

ขณะที่การเปลี่ยนผ่านกำลังประมวลผล `isPending` จะมีค่าเป็น `true` คุณสามารถใช้ค่านี้เพื่อแสดงวงล้อโหลดหรือลดความสว่างของรายการผลลัพธ์เก่า เพื่อให้ผู้ใช้ทราบว่ากำลังดำเนินการอัปเดตอยู่
return (
  <>
    <input value={inputValue} onChange={handleChange} />
    {isPending && <Spinner />}
    <ResultList items={filteredList} />
  </>
);

สิ่งที่ควรอยู่ภายใน startTransition

ใส่เฉพาะการอัปเดตสถานะไว้ภายใน startTransition อย่าใส่การดำเนินการแบบอะซิงโครนัส การอัปเดตสถานะที่ทำให้เกิดการเรนเดอร์ซึ่งใช้ทรัพยากรมากคือสิ่งที่ควรห่อไว้
// Correct
startTransition(() => setTab('heavy'));

// Wrong — async work outside React state
startTransition(async () => { await fetch(...); }); // not supported

startTransition โดยไม่ใช้ฮุก

หากคุณไม่ต้องการ `isPending` คุณสามารถนำเข้าและเรียกใช้ `startTransition` โดยตรงจาก React ได้โดยไม่ต้องใช้ฮุก
import { startTransition } from 'react';

startTransition(() => setQuery(newValue));

ตัวอย่างการสลับแท็บ

กรณีใช้งานทั่วไปคือการคลิกแท็บเพื่อสลับไปยังคอมโพเนนต์ขนาดใหญ่ ให้ห่อการเปลี่ยนแท็บไว้ใน startTransition เพื่อให้ตัวบ่งชี้แท็บที่ใช้งานอยู่ปรับปรุงได้ทันที ขณะที่คอมโพเนนต์ขนาดใหญ่เรนเดอร์อยู่เบื้องหลัง
const [tab, setTab] = useState('posts');
const [isPending, startTransition] = useTransition();

const selectTab = (t) =>
  startTransition(() => setTab(t));

useTransition เทียบกับ useDeferredValue

ใช้ useTransition เมื่อคุณเป็นผู้ควบคุมการอัปเดตสถานะ (คุณเรียก setState เอง) ใช้ useDeferredValue เมื่อคุณได้รับพร็อพหรือค่าที่ไม่สามารถหน่วงโดยตรงได้ เพราะฮุกนี้จะหน่วงตัวค่าเอง

ไม่ใช่สิ่งทดแทนการปรับประสิทธิภาพ

startTransition ไม่ได้ทำให้การเรนเดอร์เร็วขึ้น แต่เพียงเลื่อนเวลาออกไป หากคอมโพเนนต์ใช้เวลาเรนเดอร์ 500ms ก็ยังคงใช้เวลา 500ms เช่นเดิม ให้ใช้ร่วมกับ React.memo หรือการทำเวอร์ชวลไลเซชันสำหรับรายการที่ช้าอย่างแท้จริง

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

isPending จาก useTransition แสดงถึงอะไร

สรุป

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

บทถัดไป

บทถัดไป: **useDeferredValue สำหรับการหน่วงการป้อนข้อมูล** คุณจะหน่วงการเรนเดอร์ส่วนที่ช้าของส่วนติดต่อผู้ใช้ใหม่ ขณะที่ยังคงทำให้ช่องป้อนข้อมูลตอบสนองได้ฉับไว

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

บทเรียน “useTransition สำหรับการอัปเดต UI แบบไม่บล็อก” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “useTransition สำหรับการอัปเดต UI แบบไม่บล็อก”

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

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

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

บทเรียน “useTransition สำหรับการอัปเดต UI แบบไม่บล็อก” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เงื่อนไขการแข่งขันและการล้างข้อมูลของเอฟเฟกต์
  2. useTransition สำหรับการอัปเดต UI แบบไม่บล็อก
  3. useDeferredValue สำหรับหน่วงการรับข้อมูล
  4. Suspense สำหรับขอบเขตข้อมูลและโค้ด
← กลับไปที่ React Academy