ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก
ทำความเข้าใจ tearing และเหตุผลที่การสมัครรับข้อมูลจากสโตร์ภายนอกด้วย useState หรือ useRef ไม่ปลอดภัยใน React แบบทำงานพร้อมกัน
ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
แหล่งเก็บสถานะภายนอกคืออะไร
แหล่งเก็บสถานะภายนอกคือแหล่งสถานะใด ๆ ที่อยู่นอกโครงสร้างต้นไม้ของรีแอ็กต์ เช่น แหล่งเก็บสถานะของรีดักซ์ เอพีไอของเบราว์เซอร์อย่าง matchMedia หรืออ็อบเจ็กต์ระดับโมดูลธรรมดาที่มีกลไกสมัครรับของตนเอง
รีแอ็กต์ไม่ได้เป็นเจ้าของสถานะนี้ จึงต้องสมัครรับการเปลี่ยนแปลงและอ่านภาพสถานะ เพื่อให้คอมโพเนนต์สอดคล้องกับสิ่งที่แหล่งเก็บสถานะมีอยู่ในปัจจุบัน
การสมัครรับแบบง่ายด้วย useState + useEffect
แนวทางทั่วไปคืออ่านค่าของแหล่งเก็บสถานะลงใน useState จากนั้นใช้ useEffect เพื่อสมัครรับการเปลี่ยนแปลงและเรียก setState ทุกครั้งที่แหล่งเก็บสถานะเปลี่ยนแปลง เมื่อมองผิวเผิน วิธีนี้ดูเหมือนจะทำให้คอมโพเนนต์เป็นปัจจุบันอยู่เสมอ
วิธีนี้ใช้ได้กับการเรนเดอร์แบบพร้อมกันอย่างง่าย แต่มีข้อบกพร่องละเอียดอ่อนที่จะเห็นได้ชัดเมื่อรีแอ็กต์เรนเดอร์พร้อมกันและอาจหยุดหรือเริ่มงานใหม่ระหว่างทาง
ปัญหาค่าฉีกขาด
การฉีกขาดเกิดขึ้นเมื่อส่วนต่าง ๆ ของส่วนติดต่อผู้ใช้แสดงค่าที่แตกต่างกันของแหล่งเก็บสถานะเดียวกันระหว่างการเรนเดอร์รอบเดียว การเรนเดอร์พร้อมกันสามารถขัดจังหวะและกลับมาทำงานต่อได้ และแหล่งเก็บสถานะอาจเปลี่ยนแปลงในระหว่างนั้น
ผลลัพธ์คือหน้าจอไม่สอดคล้องกัน โดยคอมโพเนนต์หนึ่งแสดงค่าเก่า ขณะที่อีกคอมโพเนนต์แสดงค่าใหม่ ความไม่สอดคล้องเช่นนี้แทบเป็นไปไม่ได้ก่อนมีฟีเจอร์การเรนเดอร์พร้อมกัน
ตัวอย่าง: ค่าฉีกขาดเมื่อโหมดมืดเปลี่ยนระหว่างการเรนเดอร์
ลองจินตนาการว่าคอมโพเนนต์จำนวนมากกำลังอ่านแหล่งเก็บธีมขณะที่รีแอ็กต์เรนเดอร์พร้อมกัน หากผู้ใช้งานสลับโหมดมืดระหว่างทาง คอมโพเนนต์ที่เรนเดอร์ก่อนการสลับจะแสดงธีมสว่าง ส่วนคอมโพเนนต์ที่เรนเดอร์หลังจากนั้นจะแสดงธีมมืด
ผลคือหน้าจอมีทั้งส่วนสว่างและส่วนมืดอยู่ครึ่งหนึ่งในหนึ่งเฟรม เพราะค่าของแหล่งเก็บสถานะเปลี่ยนระหว่างการเรนเดอร์ที่รีแอ็กต์ไม่ได้ปฏิบัติเป็นการดำเนินการเดียวกัน
เหตุใด useEffect จึงช้าเกินไป
เอฟเฟกต์ทำงานหลังจากการเรนเดอร์ถูกยืนยันแล้ว ดังนั้นการสมัครรับที่อาศัย useEffect จึงไม่สามารถรับประกันได้ว่าค่าที่อ่านระหว่างการเรนเดอร์จะตรงกับแหล่งเก็บสถานะในเวลายืนยัน การสมัครรับทำงานช้าเกินกว่าจะป้องกันการแสดงผลที่ไม่สอดคล้องกัน
เมื่อเอฟเฟกต์สมัครรับใหม่และอัปเดตสถานะ ก็อาจแสดงเฟรมที่ไม่สอดคล้องกันให้ผู้ใช้งานเห็นไปแล้ว
useMutableSource ที่เลิกใช้งานแล้ว
เอพีไอเชิงทดลองรุ่นก่อนที่เรียกว่า useMutableSource พยายามแก้ปัญหาการอ่านจากแหล่งภายนอกให้ปลอดภัยกับการเรนเดอร์พร้อมกัน แต่เอพีไอของมันใช้งานให้ถูกต้องได้ยาก และไม่เคยเปิดตัวเป็นรุ่นเสถียร
ทีมรีแอ็กต์จึงแทนที่ด้วยกลไกพื้นฐานที่เรียบง่ายและใช้งานเป็นธรรมชาติมากกว่า ซึ่งให้การรับประกันความสอดคล้องแบบเดียวกันโดยไม่มีจุดที่ใช้งานพลาดได้ง่าย
useSyncExternalStore เป็นทางแก้
useSyncExternalStore คือฮุกอย่างเป็นทางการสำหรับสมัครรับแหล่งเก็บสถานะภายนอกอย่างปลอดภัยกับการเรนเดอร์พร้อมกัน โดยประสานงานกับรีแอ็กต์เพื่อให้การอ่านยังคงสอดคล้องกันตลอดการเรนเดอร์ และคอมโพเนนต์จะไม่เกิดค่าฉีกขาด
กลไกนี้กลายเป็นพื้นฐานที่แนะนำสำหรับผู้สร้างไลบรารีที่ต้องเชื่อมสถานะภายนอกเข้ากับรีแอ็กต์อย่างน่าเชื่อถือภายใต้การเรนเดอร์พร้อมกัน
ไลบรารีใดได้รับผลกระทบ
ไลบรารีสถานะที่สมัครรับแหล่งเก็บสถานะภายนอกได้รับผลกระทบโดยตรง รวมถึงรีดักซ์ ม็อบเอ็กซ์ และวัลทิโอ แต่ละไลบรารีจำเป็นต้องนำกลไกพื้นฐานใหม่นี้ไปใช้เพื่อให้ยังปลอดภัยเมื่อเปิดตัวฟีเจอร์การเรนเดอร์พร้อมกัน
ด้วยเหตุนี้การเชื่อมต่อกับรีแอ็กต์ของไลบรารีเหล่านี้จึงได้รับการอัปเดตให้เรียก useSyncExternalStore ภายใน แทนการพึ่งพารูปแบบ useState ร่วมกับ useEffect แบบเก่า
สแนปชอตที่สอดคล้องกันและความปลอดภัยในการทำงานพร้อมกัน
ฮุกรับประกันว่าคอมโพเนนต์ทุกตัวที่อ่านสโตร์ระหว่างการเรนเดอร์จะเห็นสแนปชอตเดียวกัน และจะบังคับให้เรนเดอร์ใหม่แบบ同步ทันที หากสโตร์เปลี่ยนแปลงในลักษณะที่อาจทำให้ข้อมูลที่อ่านได้ไม่สอดคล้องกัน
การทำงานร่วมกันของสแนปชอตที่สอดคล้องกันและความปลอดภัยในการทำงานพร้อมกันนี้ คือคุณค่าหลักที่ฮุกมอบให้เหนือกว่าการสร้างการสมัครรับการแจ้งเตือนด้วยตนเอง
พื้นฐานที่พร้อมรองรับอนาคต
เมื่อใช้ useSyncExternalStore การสมัครรับการแจ้งเตือนของคุณจะยังทำงานได้ถูกต้องเมื่อรีแอ็กต์พัฒนารูปแบบการเรนเดอร์ต่อไป คุณเลือกใช้การรับประกันของเฟรมเวิร์ก แทนการนำการรับประกันเหล่านั้นมาเขียนขึ้นใหม่อย่างไม่สมบูรณ์
จึงทำให้ฮุกนี้เป็นวิธีที่ทนทานและได้รับคำแนะนำสำหรับเชื่อมต่อแหล่งข้อมูลหลักภายนอกใด ๆ เข้ากับคอมโพเนนต์รีแอ็กต์
ตรวจสอบสั้น ๆ: ปัญหาข้อมูลฉีกขาด
ยืนยันความหมายของข้อมูลฉีกขาดในการเรนเดอร์พร้อมกัน
สรุป: ปัญหาของการสมัครรับสโตร์ภายนอก
สโตร์ภายนอกทำงานอยู่นอกรีแอ็กต์ และการสมัครรับการแจ้งเตือนแบบไร้การป้องกันด้วย useState ร่วมกับ useEffect ไม่สามารถป้องกันข้อมูลฉีกขาดได้เมื่อการเรนเดอร์ทำงานพร้อมกัน เอฟเฟกต์ทำงานช้าเกินไปที่จะทำให้การอ่านข้อมูลภายในการเรนเดอร์เดียวกันสอดคล้องกัน
useSyncExternalStore เข้ามาแทนที่ useMutableSource ที่ถูกยกเลิกไป และมอบสแนปชอตที่สอดคล้องกันพร้อมความปลอดภัยในการทำงานพร้อมกัน ไลบรารีอย่างรีดักซ์ ม็อบเอ็กซ์ และวัลทิโอจึงนำไปใช้เป็นพื้นฐานที่พร้อมรองรับอนาคตสำหรับการสมัครรับสโตร์
คำถามที่พบบ่อย
บทเรียน “ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก”
ทำความเข้าใจ tearing และเหตุผลที่การสมัครรับข้อมูลจากสโตร์ภายนอกด้วย useState หรือ useRef ไม่ปลอดภัยใน React แบบทำงานพร้อมกัน คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก
- API และพารามิเตอร์ของ useSyncExternalStore
- การสมัครรับข้อมูลจาก API ของเบราว์เซอร์
- การสร้างสโตร์แบบกำหนดเองด้วย useSyncExternalStore