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

useDeferredValue สำหรับหน่วงการรับข้อมูล

หน่วงการเรนเดอร์ซ้ำของส่วน UI ที่ทำงานช้า ขณะยังคงให้การรับข้อมูลตอบสนองได้ฉับไว

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

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

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

useDeferredValue คืออะไร

useDeferredValue รับค่าเข้ามาและส่งคืนค่าที่หน่วงไว้ ค่าที่หน่วงไว้จะตามหลังค่าปัจจุบันระหว่างการเรนเดอร์ที่เร่งด่วน ทำให้ React อัปเดตส่วนติดต่อผู้ใช้เป็นสองขั้นตอน ได้แก่ อัปเดตช่องป้อนข้อมูลอย่างรวดเร็ว และอัปเดตผลลัพธ์ที่ใช้ทรัพยากรมากแบบหน่วง
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
// query updates immediately on keystroke
// deferredQuery updates when React has capacity

การนำไปใช้กับคอมโพเนนต์ที่ใช้ทรัพยากรมาก

ส่งค่าที่หน่วงไว้ ไม่ใช่ค่าปัจจุบัน ไปยังคอมโพเนนต์ที่ใช้ทรัพยากรมาก คอมโพเนนต์ดังกล่าวจะเรนเดอร์ใหม่เฉพาะเมื่อ deferredQuery เปลี่ยน ซึ่งจะตามหลังช่องป้อนข้อมูลเมื่อพิมพ์อย่างรวดเร็ว
function App() {
  const [q, setQ] = useState('');
  const dq = useDeferredValue(q);
  return (
    <>
      <input value={q} onChange={e => setQ(e.target.value)} />
      <HeavyList query={dq} /> {/* renders with deferred value */}
    </>
  );
}

การแสดงตัวบ่งชี้เนื้อหาเก่า

เปรียบเทียบค่าปัจจุบันกับค่าที่หน่วงไว้ เมื่อค่าทั้งสองแตกต่างกัน เนื้อหาจะเป็นข้อมูลเก่า และคุณสามารถลดความทึบของเนื้อหาหรือแสดงวงล้อโหลดได้
const isStale = q !== dq;
<div style={{ opacity: isStale ? 0.5 : 1 }}>
  <HeavyList query={dq} />
</div>

useDeferredValue เทียบกับการหน่วงแบบกำหนดเวลา

การหน่วงที่ใช้ setTimeout จะเพิ่มความล่าช้าคงที่เสมอ เช่น 300ms แม้ในเครื่องที่เร็ว useDeferredValue ปรับตามสถานการณ์ บนอุปกรณ์ที่เร็วจะเรนเดอร์ทันที ส่วนอุปกรณ์ที่ช้าจะหน่วงการเรนเดอร์เพื่อป้องกันอาการกระตุก

useDeferredValue เทียบกับ useTransition

ใช้ useTransition เมื่อคุณเป็นผู้ควบคุมตัวตั้งค่าสถานะ (คุณสามารถห่อ setState ได้) ใช้ useDeferredValue เมื่อคุณได้รับค่าเป็นพร็อพหรือจากคอนเท็กซ์ และไม่สามารถควบคุมเวลาที่ค่าจะอัปเดตได้
// You own the state: use useTransition
startTransition(() => setTab(newTab));

// You receive the value: use useDeferredValue
const deferredProp = useDeferredValue(props.searchQuery);

การใช้ร่วมกับ React.memo

เพื่อให้ useDeferredValue ข้ามการเรนเดอร์ใหม่ได้อย่างมีประสิทธิภาพ คอมโพเนนต์ที่ใช้ทรัพยากรมากต้องห่อด้วย React.memo หากไม่ทำเช่นนั้น คอมโพเนนต์จะเรนเดอร์ใหม่ทุกครั้งที่คอมโพเนนต์แม่เรนเดอร์ใหม่ โดยไม่คำนึงถึงค่าที่หน่วงไว้
const HeavyList = React.memo(function({ query }) {
  // expensive rendering
  return <ul>{data.filter(q => ...).map(...)}</ul>;
});

ค่าที่หน่วงไว้ในการเรนเดอร์ครั้งแรก

ในการเรนเดอร์ครั้งแรก ค่าที่หน่วงไว้จะเท่ากับค่าปัจจุบัน จึงไม่มีความล่าช้า การหน่วงจะเริ่มมีผลเมื่อค่าปัจจุบันและค่าที่หน่วงไว้แตกต่างกันระหว่างการเรนเดอร์ใหม่

ค่าที่หน่วงไว้หลายค่า

คุณสามารถเรียกใช้ useDeferredValue หลายครั้งสำหรับส่วนต่าง ๆ ของส่วนติดต่อผู้ใช้ที่ใช้ทรัพยากรมาก โดยแต่ละส่วนจะถูกหน่วงอย่างเป็นอิสระต่อกัน
const deferredA = useDeferredValue(valueA);
const deferredB = useDeferredValue(valueB);

ข้อจำกัด

useDeferredValue ไม่ได้ทำให้การเรนเดอร์เร็วขึ้น แต่เพียงหน่วงเวลาออกไป หากการเรนเดอร์ที่ใช้ทรัพยากรมากใช้เวลา 500ms ส่วนติดต่อผู้ใช้ก็ยังคงกระตุก ให้ใช้ร่วมกับการทำเวอร์ชวลไลเซชัน (react-virtual) สำหรับรายการที่มีขนาดใหญ่มากจริง ๆ

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

เมื่อใดที่ useDeferredValue ให้ประโยชน์มากกว่าการใช้ค่าปกติ

สรุป

useDeferredValue ส่งคืนค่าที่ตามหลังค่าจริง ส่งค่านี้ไปยังคอมโพเนนต์ที่ใช้ทรัพยากรมากและห่อด้วย React.memo แสดงตัวบ่งชี้เนื้อหาเก่าเมื่อ deferredValue !== value เลือกใช้แทนการหน่วงแบบกำหนดเวลาคงที่เพื่อให้ได้ประสิทธิภาพที่ปรับตามสถานการณ์

บทถัดไป

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

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

บทเรียน “useDeferredValue สำหรับหน่วงการรับข้อมูล” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “useDeferredValue สำหรับหน่วงการรับข้อมูล”

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

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

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

บทเรียน “useDeferredValue สำหรับหน่วงการรับข้อมูล” ใช้เวลานานแค่ไหน

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

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

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

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

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