การจัดการเหตุการณ์พื้นที่จัดเก็บระหว่างแท็บ
ตอบสนองต่อการเปลี่ยนแปลงของ localStorage ในแท็บเบราว์เซอร์อื่นโดยใช้ตัวรับฟังเหตุการณ์พื้นที่จัดเก็บ
การจัดการเหตุการณ์พื้นที่จัดเก็บระหว่างแท็บ เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาข้อมูลเก่าระหว่างแท็บ
เมื่อผู้ใช้เปิดแอปของคุณในสองแท็บและอัปเดตค่าในแท็บ A แท็บ B ยังคงแสดงสถานะเก่าอยู่ แต่ละแท็บมีสถานะ React ของตัวเองในหน่วยความจำ แม้ว่าจะใช้ localStorage ร่วมกัน
หากไม่มีการประสานงาน แท็บต่าง ๆ จะมีความเห็นไม่ตรงกันเกี่ยวกับค่าปัจจุบัน
เหตุการณ์พื้นที่จัดเก็บทำงานในแท็บอื่น
เบราว์เซอร์จะส่งเหตุการณ์ storage ไปยังแท็บอื่นของออริจินเดียวกันทุกครั้งที่ localStorage เปลี่ยนแปลง ที่สำคัญ เหตุการณ์นี้จะไม่ทำงานในแท็บที่เป็นผู้สร้างการเปลี่ยนแปลง
นี่คือสัญญาณที่แท็บ B ต้องใช้เพื่อทราบว่าแท็บ A ได้อัปเดตบางอย่าง
การรับฟังด้วย addEventListener
ใน useEffect ให้เรียกใช้ window.addEventListener('storage', handler) แล้วคืนค่าการล้างข้อมูลที่นำตัวรับฟังออก วิธีนี้จะสมัครรับการเปลี่ยนแปลงระหว่างแท็บให้กับคอมโพเนนต์
เอฟเฟกต์ควรทำงานครั้งเดียวตอนเริ่มแสดงผล ดังนั้นจึงควรใช้อาร์เรย์การพึ่งพาที่ว่างเปล่าหรือมีค่าคงที่
คุณสมบัติของ StorageEvent
ออบเจ็กต์เหตุการณ์จะมี key ซึ่งระบุคีย์ที่เปลี่ยนแปลง oldValue และ newValue ซึ่งเป็นสตริงก่อนและหลังการเปลี่ยนแปลง และ storageArea ซึ่งเป็นออบเจ็กต์พื้นที่จัดเก็บที่ได้รับผลกระทบ
คีย์ที่เป็นค่าว่างพร้อมค่าที่เป็นค่าว่างหมายความว่าพื้นที่จัดเก็บข้อมูลถูกล้างทั้งหมด
กรองให้เหลือคีย์ของคุณ
เหตุการณ์พื้นที่จัดเก็บจะทำงานกับทุกคีย์ในออริจิน ดังนั้นตัวจัดการของคุณควรตรวจสอบ event.key === yourKey ก่อนตอบสนอง การเพิกเฉยต่อคีย์ที่ไม่เกี่ยวข้องช่วยหลีกเลี่ยงการแสดงผลใหม่โดยไม่จำเป็น
นอกจากนี้ควรจัดการกรณีที่ event.newValue เป็นค่าว่าง ซึ่งหมายความว่าคีย์นั้นถูกลบแล้ว
การอัปเดตสถานะ React เมื่อเกิดเหตุการณ์
เมื่อมีการเปลี่ยนแปลงที่เกี่ยวข้องเข้ามา ให้แยกวิเคราะห์ event.newValue แล้วเรียกใช้ตัวตั้งค่าของคุณเพื่ออัปเดตสถานะ React วิธีนี้จะทำให้แท็บที่สองสอดคล้องกับการเปลี่ยนแปลงที่เกิดขึ้นในอีกแท็บ
เมื่อใช้ร่วมกับฮุก useLocalStorage วิธีนี้จะเชื่อมการทำงานระหว่างแท็บให้ครบวงจร
ทางเลือก BroadcastChannel
BroadcastChannel ช่วยให้แท็บของออริจินเดียวกันส่งข้อความถึงกันโดยตรงด้วย postMessage วิธีนี้สะอาดกว่าการอาศัยพ่วงกับเหตุการณ์พื้นที่จัดเก็บ และยังทำงานได้แม้ไม่ได้เขียนข้อมูลลง localStorage
คุณสร้างช่องทางด้วยชื่อหนึ่ง ส่งการอัปเดต และรับฟังเหตุการณ์ message
useSyncExternalStore สำหรับพื้นที่จัดเก็บข้อมูล
React มี useSyncExternalStore สำหรับสมัครรับข้อมูลจากพื้นที่จัดเก็บภายนอกอย่างปลอดภัยในสภาพการทำงานพร้อมกัน คุณสามารถเชื่อมฟังก์ชันการสมัครรับข้อมูลของฮุกนี้เข้ากับเหตุการณ์ storage และเชื่อมภาพสถานะเข้ากับการอ่าน localStorage ได้
วิธีนี้ผสานการอัปเดตจากพื้นที่จัดเก็บภายนอกเข้ากับการแสดงผลของ React ได้อย่างถูกต้อง
กรณีใช้งานการออกจากระบบทุกแท็บ
กรณีใช้งานที่พบได้บ่อยคือการออกจากระบบทุกที่ เมื่อแท็บหนึ่งล้างเครื่องหมายการยืนยันตัวตน เหตุการณ์พื้นที่จัดเก็บในแท็บอื่นจะตรวจพบการเปลี่ยนแปลงและนำผู้ใช้ไปยังหน้าล็อกอิน
วิธีนี้ป้องกันไม่ให้แท็บที่มีข้อมูลเก่าแสดงเนื้อหาสำหรับผู้ใช้ที่ยืนยันตัวตนแล้วต่อไป
การซิงค์โหมดมืดระหว่างแท็บ
ธีมก็เหมาะกับกรณีนี้เช่นกัน เมื่อสลับโหมดมืดในแท็บหนึ่ง ระบบจะเขียนค่าลง localStorage เหตุการณ์พื้นที่จัดเก็บจะทำงานในแท็บอื่น และแท็บเหล่านั้นจะอัปเดตสถานะธีมให้ตรงกันทันที
ผู้ใช้จะเห็นรูปลักษณ์ที่สอดคล้องกันไม่ว่าจะสลับไปใช้แท็บใด
รวมการทำงานเข้าด้วยกัน
การซิงค์ระหว่างแท็บประกอบด้วยการรับฟังเหตุการณ์ storage หรือใช้ BroadcastChannel การกรองให้เหลือคีย์ของคุณ และการอัปเดตสถานะ React จากค่าใหม่
สำหรับการสมัครรับข้อมูลที่ปลอดภัยและรองรับการทำงานพร้อมกันอย่างรัดกุม useSyncExternalStore คือตัวเลือกสมัยใหม่
ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับเหตุการณ์ระหว่างแท็บ
สรุปทบทวน
คุณได้เรียนรู้ว่าเหตุการณ์ storage ทำงานในแท็บอื่น วิธีรับฟังเหตุการณ์ กรองตามคีย์ และอัปเดตสถานะ รวมถึงทางเลือกอย่าง BroadcastChannel และ useSyncExternalStore
คุณได้เห็นกรณีใช้งานจริง เช่น การออกจากระบบทุกแท็บและการซิงค์โหมดมืดระหว่างแท็บ
คำถามที่พบบ่อย
บทเรียน “การจัดการเหตุการณ์พื้นที่จัดเก็บระหว่างแท็บ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการเหตุการณ์พื้นที่จัดเก็บระหว่างแท็บ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการเหตุการณ์พื้นที่จัดเก็บระหว่างแท็บ”
ตอบสนองต่อการเปลี่ยนแปลงของ localStorage ในแท็บเบราว์เซอร์อื่นโดยใช้ตัวรับฟังเหตุการณ์พื้นที่จัดเก็บ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการเหตุการณ์พื้นที่จัดเก็บระหว่างแท็บ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การอ่านและเขียน localStorage ใน React
- การซิงค์สถานะกับ localStorage
- การจัดการเหตุการณ์พื้นที่จัดเก็บระหว่างแท็บ
- sessionStorage, IndexedDB และการเลือก API ที่เหมาะสม