0Pricing
React Academy · درس

بناء مخزن مخصص باستخدام useSyncExternalStore

نفّذوا مخزنًا خارجيًا خفيفًا من الصفر، ووصلوه بـ React باستخدام useSyncExternalStore.

بناء مخزن مخصص باستخدام useSyncExternalStore درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

المتطلبات الأساسية للمخزن

يحتاج المخزن المخصص إلى ثلاثة أشياء: بعض الحالة، وطريقة subscribe لتسجيل المستمعين، وطريقة getSnapshot لقراءة الحالة الحالية. هذا هو العقد الكامل الذي تتوقعه useSyncExternalStore.

إن إبقاء المخزن بهذا القدر من البساطة يجعله مستقلًا عن إطار العمل، ولذلك يمكن استخدام المخزن نفسه داخل React أو خارجها.

مصنع createStore

يستقبل مصنع createStore قيمة أولية، ويعيد كائنًا يتضمن getSnapshot وsubscribe وطريقة update. ويحتفظ داخليًا بالحالة الحالية ومجموعة من استدعاءات المستمعين.

يتيح لك نمط المصنع هذا إنشاء عدة مخازن مستقلة باستخدام دالة واحدة قابلة لإعادة الاستخدام.

تُبلغ دالة update المشتركين

عندما تغيّر update الحالة، فإنها تعيّن القيمة الجديدة ثم تستدعي كل مستمع مسجّل. وهذه المستمعون هم الاستدعاءات التي وفرتها React من خلال subscribe.

ويُبلغ استدعاؤهم React بأن المخزن قد تغيّر، مما يحفزها على إعادة قراءة getSnapshot وإعادة تصيير أي مكوّنات تقرأ من المخزن.

الربط بـ React عبر الوصلة

يقرأ المكوّن من المخزن باستدعاء useSyncExternalStore مع طريقتَي subscribe وgetSnapshot الخاصتين بالمخزن. وتعيد الوصلة القيمة الحالية، كما تعيد تصيير المكوّن عند تغيّرها.

يمكنك تغليف ذلك في وصلة مخصصة مثل useStore، بحيث تستدعي المكوّنات دالة واحدة بدلًا من إعداد وسائط الوصلة بنفسها في كل مرة.

المشاركة بين المكوّنات دون Provider

بما أن المخزن كائن على مستوى الوحدة، فإن أي مكوّن يستورده يشارك الحالة نفسها، من دون الحاجة إلى Context Provider. فلا توجد شجرة يجب تغليفها، ولا تمرير للخصائص عبر عدة مستويات.

وهذه إحدى أهم مزايا المخازن الخارجية: حالة عامة مشتركة بنموذج استيراد واستخدام مسطّح، بدلًا من تسلسل هرمي من Provider.

مخازن متعددة لأجزاء الحالة

يمكنك إنشاء عدة مخازن صغيرة، يتولى كل منها جزءًا من الحالة، بدلًا من مخزن واحد ضخم. وتشترك المكوّنات فقط في الأجزاء التي تحتاج إليها.

يحافظ ذلك على فصل المسؤوليات ويحدّ من عمليات إعادة التصيير، إذ لا يؤثر تغيير جزء واحد في المكوّنات التي تقرأ من جزء مختلف.

يستخدمه Zustand داخليًا

تعتمد Zustand، وهي مكتبة شائعة وخفيفة لإدارة الحالة، على هذا النمط تحديدًا، وتستخدم useSyncExternalStore داخليًا منذ الإصدار 4. وتتكون واجهتها البرمجية الصغيرة أساسًا من createStore مصقول مع طبقة محدِّد.

يوضح فهم هذا الارتباط طبيعة هذه المكتبات: فهي أغلفة رقيقة ومريحة حول البدائية نفسها التي يمكنك بناؤها بنفسك.

إعادة التصيير فقط عند تغيّر الشرائح

بتمرير selector إلى getSnapshot بحيث يعيد الجزء من الحالة الذي يستخدمه المكوّن فقط، تضمن أن يعيد المكوّن التصيير فقط عند تغيّر ذلك الجزء.

يتطلب هذا استقرار نتيجة selector، لذا استخدم memoization للقيم المشتقة لتجنّب الحلقة اللانهائية الناتجة عن إنشاء مرجع جديد، مع إبقاء التحديثات محصورة في الشريحة ذات الصلة.

تسمية لتصحيح الأخطاء في Devtools

لأغراض تصحيح الأخطاء، يمكنكم إرفاق تسمية بمتجر وتسجيل التحديثات، أو دمجه مع أدوات مطوري المتصفح حتى تتمكنوا من تتبّع المتجر الذي تغيّر ووقت حدوث ذلك.

حتى تسجيل بسيط في console داخل update، يكون مفعّلًا فقط خلف development flag، يساعدكم على فهم تدفق الحالة أثناء بناء المتجر.

اختبار المتجر داخل React وخارجه

بما أن المتجر عبارة عن JavaScript عادي، يمكنكم اختبار منطقه مباشرةً: استدعوا update وتحققوا من أن getSnapshot يعيد القيمة الجديدة، من دون تصيير أي شيء.

يمكنكم أيضًا اختباره داخل React من خلال تصيير مكوّن يقرأ منه والتحقق من حدوث إعادة التصيير بعد update، وبذلك تغطّون المتجر وتكامله معًا.

تحقق سريع: دالة subscribe لمتجر مخصص

تذكّروا عقد طريقة subscribe في المتجر المخصص.

مراجعة: بناء متجر مخصص

يحتاج المتجر المخصص إلى state وsubscribe وgetSnapshot. تمنحكم دالة المصنع createStore، إلى جانب update الذي يُشعِر المستمعين، حالة عامة مشتركة من دون Provider، لأن استيرادات الوحدات تشترك في نسخة واحدة.

استخدموا متاجر شرائح متعددة وselectors للحد من عمليات إعادة التصيير، مع تذكّر ضرورة ثبات المراجع. يعتمد Zustand v4+ على هذا النمط تحديدًا، كما يسهل اختبار المتجر المكتوب بـ JavaScript العادي داخل React وخارجه.

الأسئلة الشائعة

هل درس «بناء مخزن مخصص باستخدام useSyncExternalStore» مجاني؟

نعم — نص درس «بناء مخزن مخصص باستخدام useSyncExternalStore» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «بناء مخزن مخصص باستخدام useSyncExternalStore»؟

نفّذوا مخزنًا خارجيًا خفيفًا من الصفر، ووصلوه بـ React باستخدام useSyncExternalStore. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «بناء مخزن مخصص باستخدام useSyncExternalStore»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مشكلة الاشتراك في المخازن الخارجية
  2. واجهة API useSyncExternalStore ومعلماتها
  3. الاشتراك في واجهات API للمتصفح
  4. بناء مخزن مخصص باستخدام useSyncExternalStore
← العودة إلى React Academy