التعامل مع أحداث التخزين بين علامات التبويب
استجيبوا لتغييرات localStorage في علامات تبويب المتصفح الأخرى باستخدام مستمع حدث storage.
التعامل مع أحداث التخزين بين علامات التبويب درس مجاني في React Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
مشكلة قدم البيانات بين علامات التبويب
عندما يفتح المستخدم تطبيقكم في علامتي تبويب ويحدّث قيمة في علامة التبويب A، تظل علامة التبويب B تعرض الحالة القديمة. فلكل علامة تبويب حالة React خاصة بها في الذاكرة، رغم اشتراكها في localStorage.
من دون تنسيق، تختلف علامات التبويب حول القيمة الحالية.
يُطلق حدث storage في علامات التبويب الأخرى
يرسل المتصفح حدث storage إلى علامات التبويب الأخرى ذات origin نفسه كلما تغير localStorage. والأهم أنه لا يُطلق في علامة التبويب التي أجرت التغيير.
وهذه هي الإشارة التي تحتاج إليها علامة التبويب B لمعرفة أن علامة التبويب A حدّثت شيئًا.
الاستماع باستخدام addEventListener
داخل useEffect تستدعون window.addEventListener('storage', handler) وتُرجعون دالة تنظيف تزيله. ويشترك ذلك بالمكوّن في تغييرات التخزين بين علامات التبويب.
ينبغي أن يُنفذ التأثير مرة واحدة عند التركيب، لذا تكون مصفوفة التبعيات الفارغة أو المستقرة مناسبة.
خصائص StorageEvent
يحمل كائن الحدث key (المفتاح الذي تغير)، وoldValue وnewValue (السلسلتان النصيتان قبل التغيير وبعده)، وstorageArea (كائن التخزين المتأثر).
يشير مفتاح null مع قيم تساوي null إلى مسح التخزين بالكامل.
تصفية المفاتيح الخاصة بكم
يُطلق حدث storage لكل مفتاح في origin، لذلك ينبغي أن يتحقق معالجكم من event.key === yourKey قبل الاستجابة. ويؤدي تجاهل المفاتيح غير المرتبطة إلى تجنب عمليات إعادة التصيير غير الضرورية.
عالجوا أيضًا الحالة التي تكون فيها event.newValue مساوية لـ null، ما يعني أن المفتاح أُزيل.
تحديث حالة React عند وقوع الحدث
عند وصول تغيير ذي صلة، حللوا event.newValue واستدعوا دالة الضبط لتحديث حالة React. وبذلك تصبح علامة التبويب الثانية متزامنة مع التغيير الذي أُجري في مكان آخر.
وبدمج ذلك مع خطاف useLocalStorage، تكتمل حلقة المزامنة بين علامات التبويب.
البديل BroadcastChannel
يتيح BroadcastChannel لعلامات التبويب ذات origin نفسه إرسال رسائل مباشرة إلى بعضها باستخدام postMessage. وهو أنظف من الاستفادة غير المباشرة من أحداث التخزين، ويعمل حتى من دون الكتابة إلى localStorage.
تنشئون قناة باسم، وتنشرون التحديثات، وتستمعون إلى أحداث message.
استخدام useSyncExternalStore مع التخزين
يوفر React الخطاف useSyncExternalStore للاشتراك في مخازن خارجية بطريقة آمنة مع التزامن. ويمكنكم ربط دالة الاشتراك فيه بحدث storage، وربط اللقطة بقراءة من localStorage.
يدمج ذلك تحديثات التخزين الخارجية مع تصيير React بطريقة صحيحة.
حالة استخدام تسجيل الخروج عبر علامات التبويب
من التطبيقات الكلاسيكية لذلك تسجيل الخروج من جميع الأماكن: فعندما تمسح إحدى علامات التبويب علامة المصادقة، يكتشف حدث التخزين في علامات التبويب الأخرى ذلك، ويعيد توجيهها إلى شاشة تسجيل الدخول.
يمنع هذا علامة تبويب قديمة من الاستمرار في عرض محتوى يتطلب المصادقة.
مزامنة الوضع الداكن بين علامات التبويب
تُعد السمة مناسبة لهذا الغرض أيضًا: فعند تفعيل الوضع الداكن في إحدى علامات التبويب، تُكتب القيمة في localStorage، ويُطلق حدث التخزين في العلامات الأخرى، فتحدّث حالة السمة لديها لتطابقها فورًا.
ويحصل المستخدم على مظهر متسق مهما كانت علامة التبويب التي ينتقل إليها.
جمع العناصر معًا
تتمثل مزامنة علامات التبويب في الاستماع إلى حدث storage (أو استخدام BroadcastChannel)، وتصفية المفاتيح الخاصة بكم، وتحديث حالة React من القيمة الجديدة.
وللاشتراكات القوية والآمنة مع التزامن، يُعد useSyncExternalStore الخيار الحديث.
تحقق سريع
اختبروا مدى فهمكم لأحداث علامات التبويب.
مراجعة
تعلمتم أن حدث storage يُطلق في علامات التبويب الأخرى، وكيفية الاستماع إليه وتصفية الأحداث حسب المفتاح وتحديث الحالة، بالإضافة إلى بديلَي BroadcastChannel وuseSyncExternalStore.
وتعرفتم إلى حالات استخدام حقيقية مثل تسجيل الخروج من جميع علامات التبويب والوضع الداكن المتزامن بينها.
الأسئلة الشائعة
هل درس «التعامل مع أحداث التخزين بين علامات التبويب» مجاني؟
نعم — نص درس «التعامل مع أحداث التخزين بين علامات التبويب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «التعامل مع أحداث التخزين بين علامات التبويب»؟
استجيبوا لتغييرات localStorage في علامات تبويب المتصفح الأخرى باستخدام مستمع حدث storage. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «التعامل مع أحداث التخزين بين علامات التبويب»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قراءة localStorage والكتابة فيه في React
- مزامنة الحالة مع localStorage
- التعامل مع أحداث التخزين بين علامات التبويب
- sessionStorage وIndexedDB واختيار واجهة API المناسبة