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

ระยะการเรนเดอร์และการคอมมิต DOM

ติดตามวงจรการเรนเดอร์ของ React ตั้งแต่การประเมิน JSX ผ่านการปรับให้สอดคล้อง จนถึงขั้นตอนการวาดภาพของเบราว์เซอร์

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

ภาพรวมวงจรการทำงานของ React

วงจรการทำงานของ React มีสองระยะหลัก ได้แก่ ระยะเรนเดอร์และระยะคอมมิต ในระยะเรนเดอร์ React จะเรียกฟังก์ชันของคอมโพเนนต์และสร้างตัวแทนเสมือนของส่วนติดต่อผู้ใช้ (ต้นไม้ไฟเบอร์) ในระยะคอมมิต React จะนำการเปลี่ยนแปลงจากต้นไม้ไฟเบอร์ไปใช้กับ DOM จริง

ระยะเรนเดอร์สามารถถูกขัดจังหวะได้

ในโหมดทำงานพร้อมกันของ React 18 ระยะเรนเดอร์อาจหยุดชั่วคราว ถูกขัดจังหวะ หรือเริ่มใหม่ได้ React อาจเรียกฟังก์ชันของคอมโพเนนต์หลายครั้งก่อนยืนยันการเปลี่ยนแปลงใด ๆ นี่คือเหตุผลที่ฟังก์ชันของคอมโพเนนต์ต้องไม่มีผลข้างเคียง เพราะฟังก์ชันอาจทำงานมากกว่าหนึ่งครั้งต่อการอัปเดตที่ผู้ใช้มองเห็น

ระยะคอมมิตทำงานต่อเนื่องจนเสร็จเสมอ

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

สามระยะย่อยของการคอมมิต

ระยะคอมมิตมีสามระยะย่อย ได้แก่ ก่อนการเปลี่ยนแปลง (เมธอดของคอมโพเนนต์แบบคลาส getSnapshotBeforeUpdate ทำงานที่นี่เพื่ออ่านค่าจาก DOM ก่อนการเปลี่ยนแปลง), การเปลี่ยนแปลง (React แทรก อัปเดต และลบโหนด DOM) และการจัดวาง (เอฟเฟกต์แบบต่อเนื่องจะทำงานที่นี่ โดยเฉพาะ useLayoutEffect และ componentDidMount/componentDidUpdate ของคอมโพเนนต์แบบคลาส)

เอฟเฟกต์เบื้องหลัง: useEffect

useEffect เป็นเอฟเฟกต์เบื้องหลัง ซึ่งหมายความว่าจะไม่ทำงานระหว่างระยะคอมมิต หลังจากระยะคอมมิตเสร็จสิ้นและเบราว์เซอร์วาดภาพแล้ว React จะจัดกำหนดการให้เอฟเฟกต์เบื้องหลังทำงานแบบไม่พร้อมกัน เอฟเฟกต์เหล่านี้จะทำงานหลังจากเบราว์เซอร์มีโอกาสแสดง DOM ที่อัปเดตบนหน้าจอแล้ว

จังหวะการวาดภาพของเบราว์เซอร์

เบราว์เซอร์จะวาดภาพระหว่างระยะการจัดวาง (ซึ่ง useLayoutEffect ทำงาน) กับระยะเอฟเฟกต์เบื้องหลัง (ซึ่ง useEffect ทำงาน) ความแตกต่างด้านจังหวะเวลาที่สำคัญคือ useLayoutEffect ทำงานก่อนการวาดภาพ ส่วน useEffect ทำงานหลังการวาดภาพ สำหรับเอฟเฟกต์ที่เปลี่ยนแปลงสิ่งที่แสดงบนหน้าจอ ความแตกต่างนี้มีความสำคัญอย่างมาก

เหตุใด useEffect จึงทำให้การอัปเดตภาพเกิดขึ้นสองครั้ง

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

ต้นไม้ไฟเบอร์

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

การเรียกใช้ซ้ำสองครั้งในโหมดเข้มงวด

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

เหตุผลที่ฟังก์ชันคอมโพเนนต์ต้องบริสุทธิ์

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

การอ่าน DOM ระหว่างการเรนเดอร์เทียบกับเอฟเฟกต์

อย่าอ่านคุณสมบัติของ DOM โดยตรงภายในเนื้อหาฟังก์ชันคอมโพเนนต์ DOM อาจยังไม่มีอยู่ (ในกรณีการเรนเดอร์ฝั่งเซิร์ฟเวอร์) หรืออาจเป็นข้อมูลเก่า (ในการเรนเดอร์ใหม่) ให้อ่าน DOM ภายใน useLayoutEffect เสมอ (สำหรับการอ่านก่อนวาดหน้าจอ) หรือ useEffect (สำหรับการอ่านหลังวาดหน้าจอ) ซึ่งรับประกันได้ว่า DOM จะเป็นข้อมูลล่าสุด

ระยะย่อยของระยะคอมมิตของ React

useLayoutEffect ทำงานในระยะย่อยใดของระยะคอมมิตของ React

สรุปบทเรียน: ระยะการเรนเดอร์และการคอมมิต DOM

ระยะการเรนเดอร์ของ React สร้างต้นไม้ไฟเบอร์และอาจถูกขัดจังหวะได้ ส่วนระยะคอมมิตจะใช้การเปลี่ยนแปลงกับ DOM และทำงานแบบซิงโครนัสเสมอ การคอมมิตมีสามระยะย่อย ได้แก่ ก่อนการเปลี่ยนแปลงข้อมูล การเปลี่ยนแปลงข้อมูล และการจัดวาง useLayoutEffect ทำงานในระยะการจัดวางก่อนวาดหน้าจอ ส่วน useEffect ทำงานเป็นเอฟเฟกต์แบบไม่เร่งด่วนหลังวาดหน้าจอ

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

บทเรียน “ระยะการเรนเดอร์และการคอมมิต DOM” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ระยะการเรนเดอร์และการคอมมิต DOM”

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

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

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

บทเรียน “ระยะการเรนเดอร์และการคอมมิต DOM” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ระยะการเรนเดอร์และการคอมมิต DOM
  2. useLayoutEffect ทำงานเมื่อใดเทียบกับ useEffect
  3. การวัดองค์ประกอบ DOM ด้วย useLayoutEffect
  4. การหลีกเลี่ยงการจัดวางซ้ำและภาพกะพริบ
← กลับไปที่ React Academy