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

การสร้างฮุกกำหนดเอง useThrottle

สร้างฮุก useThrottle ที่จำกัดความถี่การอัปเดตค่าระหว่างเหตุการณ์ที่เกิดถี่ เช่น การเลื่อน

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

ทรอตเทิลยากกว่าดีบาวซ์

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

การใช้ useRef สำหรับ lastRunTime

ค่าประทับเวลาการทำงานครั้งล่าสุดต้องคงอยู่ข้ามการวาดใหม่โดยไม่ทำให้เกิดการวาดใหม่ด้วยตัวมันเอง ดังนั้น useRef จึงเป็นเครื่องมือที่เหมาะสม ให้เก็บค่าประทับเวลาเป็น const lastRunTime = useRef(Date.now()) ต่างจากสถานะ การอัปเดตการอ้างอิงจะไม่ทำให้เกิดการวาดใหม่ ตรรกะของทรอตเทิลจึงทำงานได้อย่างมีประสิทธิภาพโดยไม่สร้างรอบการทำงานเพิ่มเติม

รูปแบบการประกาศฮุก

ฮุก useThrottle(value, delay) จะคืนค่าป้อนเข้าที่ผ่านการจำกัดความถี่ สัญญาการทำงานคล้ายกับ useDebounce: รับค่าใดก็ได้และระยะหน่วงเป็นมิลลิวินาที แล้วคืนค่าที่ผ่านทรอตเทิล คอมโพเนนต์ใช้งานในลักษณะเดียวกันได้ จึงเป็นทางเลือกที่นำมาแทนที่ได้ทันทีสำหรับรูปแบบการจับเวลาที่แตกต่างกัน

การนำขอบท้ายไปใช้งาน

การจำกัดความถี่แบบขอบท้ายจะอัปเดตค่าเมื่อสิ้นสุดแต่ละช่วงเวลา เมื่อมีค่าใหม่เข้ามา ให้ตั้งเวลา setTimeout ตามเวลาที่เหลือของช่วงเวลา: delay - (Date.now() - lastRunTime.current) เมื่อตัวจับเวลาทำงาน ให้อัปเดตสถานะและบันทึก lastRunTime ค่าใหม่ ยกเลิกตัวจับเวลาก่อนหน้าในขั้นตอนการล้างข้อมูล

การนำขอบหน้าไปใช้งาน

การจำกัดความถี่แบบขอบหน้าจะใช้ค่าครั้งแรกทันทีและละเว้นค่าถัดไปจนกว่าช่วงเวลาจะหมด ให้ตรวจสอบว่า Date.now() - lastRunTime.current >= delay หรือไม่ หากเป็นจริง ให้อัปเดตสถานะและบันทึกเวลา มิฉะนั้นให้ข้ามการอัปเดต วิธีนี้ให้ผลตอบสนองทันทีต่อการกระทำแรก พร้อมช่วงพักหลังจากนั้น

การรวมขอบหน้าและขอบท้าย

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

การใช้ useRef สำหรับรหัสหมดเวลา

เก็บรหัสหมดเวลาที่รอดำเนินการไว้ใน useRef: const timeoutRef = useRef(null) ก่อนตั้งเวลาหมดเวลาใหม่ ให้เรียก clearTimeout(timeoutRef.current) เพื่อยกเลิกตัวจับเวลาที่มีอยู่ วิธีนี้ป้องกันไม่ให้มีตัวจับเวลาหลายตัวทำงานซ้อนกัน ซึ่งอาจทำให้เกิดการอัปเดตหลายครั้งภายในช่วงเวลาจำกัดความถี่เดียว

การล้างข้อมูลเมื่อถอดคอมโพเนนต์ออก

ฟังก์ชันล้างข้อมูลของ useEffect ควรเรียก clearTimeout(timeoutRef.current) เพื่อยกเลิกการอัปเดตขอบท้ายที่รอดำเนินการเมื่อคอมโพเนนต์ถูกถอดออก หากไม่มีการทำเช่นนี้ รหัสหมดเวลาที่รอดำเนินการจะทำงานหลังจากถอดคอมโพเนนต์ออก และพยายามตั้งค่าสถานะบนคอมโพเนนต์ที่ถูกถอดออกแล้ว ซึ่งอาจทำให้รีแอ็กต์แสดงคำเตือน

ทางเลือก: ฟังก์ชันเรียกกลับแบบจำกัดความถี่

แทนที่จะใช้ฮุกที่อิงตามค่า คุณสามารถสร้างฮุกจำกัดความถี่ที่อิงตาม useCallback ได้: useThrottledCallback(fn, delay) จะส่งคืนฟังก์ชันเวอร์ชันที่ถูกจำกัดความถี่ วิธีนี้ยืดหยุ่นกว่าเมื่อสิ่งที่ต้องการจำกัดความถี่คือการเรียกใช้ฟังก์ชัน เช่น ตัวติดตามการวิเคราะห์ แทนที่จะเป็นค่าที่ตอบสนองต่อการเปลี่ยนแปลง

การทดสอบการจำกัดความถี่ด้วยตัวจับเวลาจำลอง

ในการทดสอบของเจสต์ ให้ใช้ jest.useFakeTimers() เพื่อควบคุมเวลา ตั้งค่าการจำกัดความถี่ด้วยความล่าช้า 1,000 มิลลิวินาที ทำให้ค่าเปลี่ยนแปลงอย่างรวดเร็ว 10 ครั้ง จากนั้นเลื่อนเวลาเสมือนไปข้างหน้า 500 มิลลิวินาที และตรวจสอบว่าเกิดการอัปเดตเพียง 1 หรือ 2 ครั้ง เลื่อนเวลาไปข้างหน้าอีก 500 มิลลิวินาที แล้วตรวจสอบว่าการอัปเดตขอบท้ายทำงาน วิธีนี้ตรวจสอบพฤติกรรมของการจำกัดความถี่ได้อย่างแน่นอนและทำซ้ำได้

การจำกัดความถี่ในโมเดลของรีแอ็กต์

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

การจำกัดความถี่แบบขอบท้ายเทียบกับขอบหน้า

การจำกัดความถี่แบบ “ขอบท้าย” ทำงานที่ขอบใด

สรุปบทเรียน: ฮุก useThrottle

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

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

บทเรียน “การสร้างฮุกกำหนดเอง useThrottle” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างฮุกกำหนดเอง useThrottle”

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

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

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

บทเรียน “การสร้างฮุกกำหนดเอง useThrottle” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เหตุผลที่ดีบาวซ์และธรอตเทิลสำคัญต่อ UI
  2. การสร้างฮุกกำหนดเอง useDebounce
  3. การสร้างฮุกกำหนดเอง useThrottle
  4. การประยุกต์ใช้จริง: การค้นหา การเลื่อน และการปรับขนาด
← กลับไปที่ React Academy