การสร้างฮุกกำหนดเอง useDebounce
สร้างฮุก useDebounce ที่หน่วงการอัปเดตสถานะจนกว่าผู้ใช้จะหยุดพิมพ์
การสร้างฮุกกำหนดเอง useDebounce เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
รูปแบบการประกาศฮุก
ฮุก useDebounce รับค่าและระยะหน่วงเป็นมิลลิวินาที แล้วคืนค่าที่ผ่านดีบาวซ์: function useDebounce(value, delay) ค่า debouncedValue ที่คืนมาจะตามหลังค่าจริง โดยอัปเดตเฉพาะเมื่อพ้นระยะหน่วงที่กำหนดแล้วและไม่มีการเปลี่ยนแปลงเพิ่มเติม
สถานะภายในสำหรับ debouncedValue
ภายในฮุก ให้ประกาศตัวแปรสถานะดังนี้: const [debouncedValue, setDebouncedValue] = useState(value) สถานะนี้เก็บค่าที่ได้รับการยืนยันล่าสุด โดยเริ่มต้นเท่ากับค่าเริ่มต้นและอัปเดตเฉพาะหลังจากตัวจับเวลาดีบาวซ์ทำงาน คอมโพเนนต์ที่อ่านค่า debouncedValue จะเห็นค่าป้อนเข้าที่คงที่และหยุดนิ่งแล้ว
useEffect กับ setTimeout
ตรรกะหลักอยู่ใน useEffect ให้สร้างตัวจับเวลาด้วย setTimeout(() => setDebouncedValue(value), delay) และเก็บ ID ไว้ เอฟเฟกต์จะทำงานทุกครั้งที่ค่าหรือระยะหน่วงเปลี่ยน ตัวจับเวลาจะทำงานหลังจากการเปลี่ยนแปลงครั้งล่าสุดครบระยะหน่วงมิลลิวินาที และอัปเดตสถานะที่ผ่านดีบาวซ์
การล้างตัวจับเวลาในฟังก์ชันล้างข้อมูล
ฟังก์ชันล้างข้อมูลของ useEffect จะเรียกใช้ clearTimeout(timerId) เมื่อค่าป้อนเข้าเปลี่ยนก่อนที่ตัวจับเวลาจะทำงาน รีแอ็กต์จะเรียกใช้ฟังก์ชันล้างข้อมูลเพื่อยกเลิกการอัปเดตที่รอดำเนินการ จากนั้นจึงตั้งตัวจับเวลาใหม่ กลไกนี้เป็นหัวใจสำคัญที่ทำให้ดีบาวซ์ทำงานได้: การเปลี่ยนแปลงอย่างรวดเร็วจะรีเซ็ตตัวจับเวลาอยู่เสมอ
การพึ่งพาของเอฟเฟกต์
อาร์เรย์การพึ่งพาของ useEffect ควรมี [value, delay] เอฟเฟกต์จะทำงานซ้ำทุกครั้งที่ค่าป้อนเข้าเปลี่ยน (จึงตั้งตัวจับเวลาใหม่) และทุกครั้งที่ระยะหน่วงเปลี่ยน (ในกรณีที่ผู้เรียกปรับช่วงเวลาดีบาวซ์แบบไดนามิก) ต้องใส่ทั้งสองรายการเพื่อหลีกเลี่ยงปัญหาคลอเชอร์ที่เป็นค่าล้าสมัย
การใช้ฮุกในคอมโพเนนต์
การใช้งานทำได้ง่าย: const debouncedSearch = useDebounce(searchInput, 300) จากนั้น useEffect แยกต่างหากที่มี [debouncedSearch] เป็นรายการพึ่งพาจะส่งคำขอไปยังเซิร์ฟเวอร์ สถานะช่องป้อนข้อมูล (searchInput) อัปเดตทันที ทำให้ช่องป้อนข้อมูลตอบสนองได้ดี ส่วนคำขอไปยังเซิร์ฟเวอร์เท่านั้นที่รอการทำงานของดีบาวซ์
กรณีขอบของการเรียกครั้งแรกทันที
โดยค่าเริ่มต้น การนำไปใช้มาตรฐานจะทำงานเฉพาะที่ขอบท้าย หากต้องการโหมด "ทำงานทันที" ที่เรียกใช้ฟังก์ชันเมื่อถูกกระตุ้นครั้งแรก แต่ใช้ดีบาวซ์กับการเรียกครั้งถัดไป คุณต้องใช้การอ้างอิงเพื่อติดตามว่าเรียกใช้แล้วหรือไม่ และรีเซ็ตหลังจากหมดเวลา วิธีนี้ซับซ้อนกว่า แต่มีประโยชน์สำหรับปุ่มส่งแบบฟอร์ม
พารามิเตอร์ชนิดทั่วไปของ TypeScript
ทำให้ฮุกเป็นชนิดทั่วไปเพื่อความปลอดภัยด้านชนิดข้อมูล: function useDebounce(value: T, delay: number): T วิธีนี้ทำให้ TypeScript อนุมานชนิดของ debouncedValue จากชนิดของ value ได้ พารามิเตอร์ชนิดทั่วไป T จะถูกส่งต่อผ่านสถานะภายในและชนิดค่าที่คืนมาโดยอัตโนมัติ
ข้อผิดพลาดที่พบบ่อย: ลืมล้างข้อมูล
ข้อผิดพลาดที่พบบ่อยคือการลืมคืนค่าฟังก์ชันล้างข้อมูลจาก useEffect หากไม่มีการล้างข้อมูล การเปลี่ยนแปลงค่าทุกครั้งจะสร้างตัวจับเวลาใหม่แต่ไม่เคยยกเลิกตัวเก่า ผลคือตัวจับเวลาหลายตัวทำงาน ทำให้มีการเรียกใช้ setDebouncedValue หลายครั้งด้วยค่าที่ล้าสมัย และทำให้ดีบาวซ์ไม่ทำงานเลย
การเปรียบเทียบกับแนวทางที่ใช้ useRef
อีกทางเลือกหนึ่งคือเก็บฟังก์ชันดีบาวซ์ไว้ใน useRef โดยใช้ไลบรารีโลแดช ต่างจากแนวทางที่ใช้สถานะ แนวทางที่ใช้การอ้างอิงจะทำดีบาวซ์กับฟังก์ชันเรียกกลับแทนที่จะทำกับค่า ใช้ฮุกที่อิงสถานะเมื่อคุณต้องการค่าที่คำนวณต่อมา และใช้แนวทางฟังก์ชันเรียกกลับเมื่อคุณต้องการทำดีบาวซ์กับตัวจัดการเหตุการณ์
การตรวจสอบการทำงานจริง
ตรวจสอบว่าฮุกทำงานได้โดยเพิ่มการบันทึกลงคอนโซลภายในฟังก์ชันเรียกกลับของตัวจับเวลา แล้วดูคอนโซลของเบราว์เซอร์ขณะพิมพ์อย่างรวดเร็ว คุณควรเห็นการบันทึกหนึ่งรายการต่อเหตุการณ์หยุดพิมพ์ ไม่ใช่หนึ่งรายการต่อการกดแป้น จำนวนการบันทึกควรน้อยกว่าจำนวนครั้งที่กดแป้นมากเมื่อพิมพ์อย่างรวดเร็ว
การล้างข้อมูลของ useEffect ใน useDebounce
เหตุใด useEffect ใน useDebounce จึงต้องคืนค่าฟังก์ชันล้างข้อมูลที่เรียกใช้ clearTimeout
สรุปบทเรียน: ฮุก useDebounce
ฮุก useDebounce(value, delay) เก็บสถานะที่ผ่านดีบาวซ์ ซึ่งจะอัปเดตหลังจากไม่มีเหตุการณ์เป็นเวลา delay มิลลิวินาทีเท่านั้น ฟังก์ชัน useEffect ของฮุกจะตั้งตัวจับเวลาและล้างตัวจับเวลาในฟังก์ชันล้างข้อมูลเพื่อยกเลิกตัวจับเวลาที่ล้าสมัย ใช้ค่าที่ผ่านดีบาวซ์เป็นรายการพึ่งพาสำหรับเอฟเฟกต์ที่ดึงข้อมูลจากเซิร์ฟเวอร์ เพิ่มชนิดทั่วไปของ TypeScript เพื่อความปลอดภัยด้านชนิดข้อมูลอย่างสมบูรณ์
คำถามที่พบบ่อย
บทเรียน “การสร้างฮุกกำหนดเอง useDebounce” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างฮุกกำหนดเอง useDebounce” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างฮุกกำหนดเอง useDebounce”
สร้างฮุก useDebounce ที่หน่วงการอัปเดตสถานะจนกว่าผู้ใช้จะหยุดพิมพ์ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างฮุกกำหนดเอง useDebounce” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุผลที่ดีบาวซ์และธรอตเทิลสำคัญต่อ UI
- การสร้างฮุกกำหนดเอง useDebounce
- การสร้างฮุกกำหนดเอง useThrottle
- การประยุกต์ใช้จริง: การค้นหา การเลื่อน และการปรับขนาด