ใช้ useLayoutEffect เพื่อวัดขนาดก่อนเริ่มแอนิเมชัน
ใช้ useLayoutEffect เพื่อวัดขนาดองค์ประกอบก่อนเริ่มแอนิเมชันและหลีกเลี่ยงการกระโดดของเค้าโครง
ใช้ useLayoutEffect เพื่อวัดขนาดก่อนเริ่มแอนิเมชัน เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาการกะพริบ
บางครั้งองค์ประกอบจะกระโดดหรือกะพริบอย่างเห็นได้ชัดในการแสดงผลครั้งแรก ก่อนจะเข้าที่ ปัญหานี้มักเกิดขึ้นเมื่อคุณวัดค่าหรือจัดตำแหน่งองค์ประกอบใหม่หลังจากที่เบราว์เซอร์วาดองค์ประกอบไปแล้ว
ผู้ใช้จะเห็นตำแหน่งที่ไม่ถูกต้องเป็นเวลาหนึ่งเฟรม จากนั้นจึงเห็นการแก้ไขอย่างฉับพลัน ซึ่งดูเหมือนการทำงานผิดพลาด
เหตุผลที่ useEffect ทำให้เกิดการกะพริบ
useEffect ทำงานหลังจากเบราว์เซอร์วาดภาพแล้ว ดังนั้นหากคุณอ่านค่าการวัดและอัปเดต DOM ภายใน useEffect ผู้ใช้จะเห็นเฟรมที่ยังไม่ได้แก้ไขก่อนที่การเปลี่ยนแปลงของคุณจะมีผล
สำหรับการจัดตำแหน่งภาพที่ผู้ใช้ไม่ควรมองเห็นความเปลี่ยนแปลง จังหวะหลังการวาดจึงสายเกินไป
useLayoutEffect ทำงานก่อนการวาด
useLayoutEffect ทำงานแบบพร้อมกันหลังจาก React เปลี่ยนแปลง DOM แต่ก่อนที่เบราว์เซอร์จะวาดภาพ การอ่านหรือเขียน DOM ใด ๆ ที่ทำในจุดนี้จะเสร็จสมบูรณ์ก่อนที่ผู้ใช้จะเห็นแม้แต่เฟรมเดียว
จึงเป็นเครื่องมือที่เหมาะสำหรับการวัดค่าและจัดตำแหน่งที่ต้องแสดงผลได้ถูกต้องทันที
การวัดตำแหน่งเริ่มต้น
ภายใน useLayoutEffect คุณสามารถอ่านเค้าโครงขององค์ประกอบด้วย ref.current.getBoundingClientRect() เพื่อเก็บตำแหน่งและขนาดก่อนเริ่มแอนิเมชัน
เนื่องจากทำงานก่อนการวาด คุณจึงสามารถวัดค่าและใช้การแปลงเป็นจุดเริ่มต้นได้โดยไม่เกิดการกะพริบที่มองเห็นได้
เทคนิค FLIP
FLIP ย่อมาจาก ตำแหน่งแรก ตำแหน่งสุดท้าย กลับด้าน และเล่น คุณบันทึกตำแหน่งแรกขององค์ประกอบ ปล่อยให้องค์ประกอบเคลื่อนไปยังตำแหน่งสุดท้าย จากนั้นกลับด้านด้วยการใช้การแปลงที่ทำให้มองเห็นองค์ประกอบกลับไปอยู่ที่ตำแหน่งแรก และสุดท้ายจึงเล่นโดยนำการแปลงออก เพื่อให้แอนิเมชันเคลื่อนไปยังตำแหน่งสุดท้าย
วิธีนี้ทำให้คุณสร้างแอนิเมชันสำหรับการเปลี่ยนแปลงเค้าโครงได้โดยใช้เพียง transform ที่ประหยัดทรัพยากร แม้ว่าเค้าโครงจริงจะเปลี่ยนตำแหน่งทันที
getBoundingClientRect ใน useLayoutEffect
การอ่านค่าหลักเกิดขึ้นใน useLayoutEffect โดยเก็บข้อมูลขอบเขตแรกก่อนการเปลี่ยนแปลงและข้อมูลขอบเขตสุดท้ายหลังการเปลี่ยนแปลง จากนั้นจึงคำนวณผลต่าง การทำเช่นนี้ก่อนการวาดทำให้มั่นใจได้ว่าการแปลงแบบกลับด้านจะอยู่ในตำแหน่งก่อนที่จะแสดงสิ่งใด
ความแตกต่างระหว่างข้อมูลขอบเขตทั้งสองทำให้คุณได้ค่าการเลื่อนและการปรับขนาดที่แน่นอนสำหรับการกลับด้าน
ใช้การแปลงแบบพร้อมกัน
คุณใช้การแปลงแบบกลับด้านอย่างพร้อมกันภายใน useLayoutEffect จากนั้นจึงนำการแปลงออกในเฟรมถัดไป เพื่อให้องค์ประกอบเคลื่อนไปยังตำแหน่งตามธรรมชาติ โดยทั่วไปคุณจะเรียกขั้นตอนการเล่นด้วย requestAnimationFrame
เนื่องจากใช้การกลับด้านก่อนการวาด ผู้ใช้จึงไม่เคยเห็นองค์ประกอบอยู่ที่ตำแหน่งสุดท้ายจริงที่ยังไม่ได้แปลง
คำเตือน SSR
บนเซิร์ฟเวอร์ไม่มี DOM ดังนั้น React จึงบันทึกคำเตือนว่า useLayoutEffect ไม่ทำอะไรระหว่างการเรนเดอร์ฝั่งเซิร์ฟเวอร์ เอฟเฟกต์ด้านเค้าโครงใช้ได้ในเบราว์เซอร์เท่านั้น
คำเตือนนี้บ่งบอกว่าเอฟเฟกต์ไม่สามารถทำงานได้ในที่ที่ไม่มีสิ่งใดให้วัดค่า
ทางเลือกสำรองที่ปลอดภัยสำหรับ SSR
หากคอมโพเนนต์ต้องทำงานบนเซิร์ฟเวอร์ ให้ใช้ useEffect ร่วมกับ requestAnimationFrame เพื่อวัดค่าก่อนการวาดครั้งถัดไป หรือเลือกใช้ useLayoutEffect เฉพาะในเบราว์เซอร์
วิธีนี้ช่วยหลีกเลี่ยงคำเตือน พร้อมยังได้จังหวะที่ใกล้เคียงกับก่อนการวาดสำหรับแอนิเมชันที่ไม่สำคัญ
ตัวอย่างแผงพับขยาย
แอนิเมชันความสูงเป็นกรณีคลาสสิก ได้แก่ วัดความสูงเมื่อพับและเมื่อขยายใน useLayoutEffect จากนั้นทำแอนิเมชันระหว่างค่าพิกเซลที่กำหนดไว้อย่างชัดเจน เพื่อให้การเปลี่ยนผ่านราบรื่น
เนื่องจากความสูงแบบ auto ไม่สามารถทำแอนิเมชันได้ การวัดความสูงจริงก่อนจึงช่วยให้คุณเปลี่ยนไปยังค่าตัวเลขที่แน่นอนได้
เมื่อใดจึงควรใช้ useLayoutEffect
โดยทั่วไปให้ใช้ useEffect สำหรับงานส่วนใหญ่ ใช้ useLayoutEffect เฉพาะเมื่อคุณอ่านเค้าโครงและจำเป็นต้องเปลี่ยนแปลง DOM ก่อนการวาด เพื่อหลีกเลี่ยงการกะพริบที่มองเห็นได้
การใช้มากเกินไปอาจทำให้ประสิทธิภาพลดลง เพราะจะขัดขวางการวาดจนกว่าจะทำงานเสร็จ
ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับจังหวะการทำงานของเอฟเฟกต์
ทบทวน
คุณได้เรียนรู้ว่าปัญหาการกะพริบเกิดจากการวัดค่าหลังการวาด ว่า useLayoutEffect ทำงานก่อนการวาด และเทคนิค FLIP ใช้แอนิเมชันการเปลี่ยนแปลงเค้าโครงด้วยการแปลงที่ประหยัดทรัพยากรได้อย่างไร
คุณยังได้เห็นคำเตือน SSR และทางเลือกสำรองที่ใช้ useEffect ร่วมกับ requestAnimationFrame
คำถามที่พบบ่อย
บทเรียน “ใช้ useLayoutEffect เพื่อวัดขนาดก่อนเริ่มแอนิเมชัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ใช้ useLayoutEffect เพื่อวัดขนาดก่อนเริ่มแอนิเมชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ใช้ useLayoutEffect เพื่อวัดขนาดก่อนเริ่มแอนิเมชัน”
ใช้ useLayoutEffect เพื่อวัดขนาดองค์ประกอบก่อนเริ่มแอนิเมชันและหลีกเลี่ยงการกระโดดของเค้าโครง คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ใช้ useLayoutEffect เพื่อวัดขนาดก่อนเริ่มแอนิเมชัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเปลี่ยนผ่าน CSS เมื่อสถานะ React เปลี่ยนแปลง
- แอนิเมชันคีย์เฟรม CSS ด้วย React
- ใช้ useLayoutEffect เพื่อวัดขนาดก่อนเริ่มแอนิเมชัน
- แอนิเมชันเข้าและออกโดยไม่ใช้ไลบรารี