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

ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก

ทำความเข้าใจ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก
  2. API และพารามิเตอร์ของ useSyncExternalStore
  3. การสมัครรับข้อมูลจาก API ของเบราว์เซอร์
  4. การสร้างสโตร์แบบกำหนดเองด้วย useSyncExternalStore
← กลับไปที่ React Academy