واجهة API useSyncExternalStore ومعلماتها
تعلّموا معاملات subscribe وgetSnapshot وgetServerSnapshot، والضمانات التي يجب أن توفرها.
واجهة API useSyncExternalStore ومعلماتها درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
نظرة عامة على الوسائط الثلاثة
تقبل useSyncExternalStore ما يصل إلى ثلاث وسائط: subscribe وgetSnapshot وgetServerSnapshot الاختيارية. وتوضح هذه الوسائط مجتمعةً لـ React كيفية الاستماع إلى التغييرات وكيفية قراءة القيمة الحالية.
يُعد فهم كل وسيطة أمرًا أساسيًا، إذ إن الأخطاء الصغيرة فيها هي المصدر الأكثر شيوعًا للأخطاء عند استخدام هذه الوصلة.
الدالة subscribe
تتلقى subscribe استدعاءً من React، ويجب أن تسجله في المخزن كي يُنفَّذ الاستدعاء كلما تغيّر المخزن. ويجب أن تعيد دالة لإلغاء الاشتراك، تستدعيها React عند التنظيف.
تستخدم React هذه الآلية لمعرفة وقت إعادة قراءة اللقطة، لذا تقتصر مهمة subscribe على إعداد إشعارات التغيير وإزالتها.
تعيد getSnapshot القيمة الحالية
تعيد getSnapshot القيمة الحالية للمخزن. تستدعيها React أثناء التصيير لقراءة الحالة، ثم تستدعيها مجددًا بعد الإشعارات لاكتشاف ما إذا كانت القيمة قد تغيّرت.
والأهم أنها يجب أن تعيد نتيجة مستقرة مرجعيًا عندما لا تكون البيانات الأساسية قد تغيّرت، أي أن تعيد المرجع نفسه بدلًا من إنشاء كائن جديد في كل مرة.
getServerSnapshot للتصيير من جانب الخادم
توفر getServerSnapshot الاختيارية القيمة المستخدمة أثناء التصيير من جانب الخادم وأثناء مرحلة إعادة الإماهة الأولية. وهي ضرورية لأن getSnapshot المخصصة للمتصفح قد تعتمد على واجهات برمجية غير موجودة على الخادم.
ويمنع توفيرها عدم تطابق إعادة الإماهة، إذ يمنح الخادم قيمة منطقية لتصييرها، تطابق ما سينتجه العميل مبدئيًا.
القيمة المُعادة
تعيد الوصلة قيمة اللقطة الحالية، ويمكنك استخدامها مباشرةً في مكوّنك مثل أي جزء آخر من الحالة. وعندما يتغيّر المخزن، تعيد React تصيير المكوّن، ثم تعيد الوصلة اللقطة المحدّثة.
ومن منظور المكوّن، يبدو الأمر كأنه قراءة لحالة تفاعلية، رغم أن مصدر الحقيقة موجود بالكامل خارج React.
يجب أن تكون getSnapshot متزامنة ومتسقة
يجب أن تُنفَّذ getSnapshot بشكل متزامن وأن تعيد قيمة مشتقة حصريًا من حالة المخزن الحالية. وينبغي ألا تنفّذ عملًا غير متزامن أو تنتج نتائج مختلفة للبيانات الأساسية نفسها.
تعتمد React على استدعائها مرارًا ومقارنة النتائج، لذلك قد يؤدي أي سلوك غير حتمي أو آثار جانبية داخلها إلى سلوك غير صحيح.
نمط اللقطة غير القابلة للتغيير
تجعل المخازن التي تحتفظ بحالة غير قابلة للتغيير من السهل تنفيذ getSnapshot، إذ لا يتغير مرجع كائن الحالة الحالية إلا عند تغيّر البيانات. ويمنحك إعادة هذا المرجع مقارنات مستقرة تلقائيًا.
ولهذا تتوافق أنماط التحديث غير القابلة للتغيير جيدًا مع هذه الوصلة: البيانات المتساوية تعني مرجعًا متساويًا، وتتجاوز React عمليات إعادة التصيير غير الضرورية.
خطأ الحلقة اللانهائية
من الأخطاء الشائعة إعادة كائن أو مصفوفة جديدة تمامًا من getSnapshot في كل استدعاء، مثل تنفيذ عملية mapping أو filtering داخلها. ترى React مرجعًا جديدًا في كل مرة، فتظن أن القيمة قد تغيّرت.
ويؤدي ذلك إلى عمليات إعادة تصيير لا نهائية أو إلى تحذيرات. ويكمن الحل في تخزين القيمة المشتقة مؤقتًا وإعادة المرجع نفسه إلى أن تتغيّر البيانات المصدر فعلًا.
الحفاظ على استقرار اللقطات
لتجنب الحلقة، احسب البيانات المشتقة خارج getSnapshot أو استخدم memoize بحيث تعيد الدالة مرجعًا مخزّنًا مؤقتًا. ويوجد نمط شبيه بالمحدِّد تستخدمه مكتبات كثيرة تحديدًا لإدارة هذا الاستقرار.
القاعدة الإرشادية هي أن يعيد استدعاءان لـ getSnapshot، مع عدم تغيّر بيانات المخزن، المرجع نفسه تمامًا.
جمع الوسائط معًا
عمليًا، تكتب subscribe تضيف مستمعًا وتزيله، وgetSnapshot تقرأ قيمة حالية مستقرة، وgetServerSnapshot تعيد قيمة آمنة للخادم عند استخدام SSR.
عند صحة هذه الوسائط الثلاثة، توفر الوصلة قراءات متسقة وآمنة مع التزامن من مخزنك الخارجي، بأقل قدر من الإعدادات.
تحقق سريع: وسائط useSyncExternalStore
حدّد دور getSnapshot.
مراجعة: واجهة برمجة useSyncExternalStore
تقبل الوصلة subscribe وgetSnapshot، وتقبل getServerSnapshot اختياريًا. تربط subscribe مستمعًا وتعيد دالة لإلغاء الاشتراك؛ وتقرأ getSnapshot القيمة الحالية بشكل متزامن، ويجب أن تكون مستقرة مرجعيًا؛ أما getServerSnapshot فتوفّر قيمة آمنة لـ SSR.
المأزق الشائع هو إعادة كائن جديد في كل استدعاء، مما يسبب حلقات لا نهائية. خزّن القيم المشتقة مؤقتًا كي تعيد البيانات غير المتغيّرة المرجع نفسه.
الأسئلة الشائعة
هل درس «واجهة API useSyncExternalStore ومعلماتها» مجاني؟
نعم — نص درس «واجهة API useSyncExternalStore ومعلماتها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «واجهة API useSyncExternalStore ومعلماتها»؟
تعلّموا معاملات subscribe وgetSnapshot وgetServerSnapshot، والضمانات التي يجب أن توفرها. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «واجهة API useSyncExternalStore ومعلماتها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مشكلة الاشتراك في المخازن الخارجية
- واجهة API useSyncExternalStore ومعلماتها
- الاشتراك في واجهات API للمتصفح
- بناء مخزن مخصص باستخدام useSyncExternalStore