الزاوي: مثال على استخدام NGRX

صورة
هذا المقال هو استمرار لمقالة "الزاوي: مقدمة تمهيدية لـ NGRX."

مثال NGRX


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

خطة عمل:

  1. تركيب المكتبة
  2. إنشاء هيكل مجلد للتخزين
  3. إنشاء التخزين والقيم الأولية
  4. إنشاء الإجراءات
  5. إنشاء علب التروس (المخفضات)
  6. خلق تأثيرات
  7. إنشاء المحددات
  8. الإعداد النهائي
  9. استخدام التخزين في المكونات

لنفعلها اذا ...

تركيب المكتبة


سنستخدم Angle Cli لإنشاء المشروع ، ثم سنضيف مكتبات ngrx.

إنشاء مشروع:

ng new angular-ngrx --style=scss

أضف مكتبات NGRX اللازمة:

npm install @ngrx/core @ngrx/store @ngrx/effects @ngrx/store-devtools @ngrx/router-store --save

نقوم بتثبيت جميع مكتبات النظام البيئي ngrx تقريبًا. معظمها يصف بوضوح الغرض منها: النواة ، التخزين ، التأثيرات ، ولكن هناك زوجان قد تتساءل عن سبب الحاجة إليهما؟

  • store-devtools - أداة تصحيح قوية.
  • جهاز التوجيه - يحفظ حالة جهاز التوجيه الزاوي في التخزين.

هيكل المجلد للتخزين


لنبدأ بمناقشة بنية ملف المستودع. يجب أن يكون هيكل الملف هذا وتكوين التخزين بالكامل موجودًا في الوحدة الرئيسية للتطبيق الخاص بك ، ولكن في مثالنا غير موجود ، وبالتالي فإن التخزين سيكون موجودًا في الوحدة الرئيسية لتطبيقنا (الخطوات هي نفسها تقريبًا إذا قمت بذلك في الوحدة الرئيسية الرئيسية).

صورة

هيكل المجلد هو تمثيل لتكوين التخزين الفعلي. سيكون لديك مجلد رئيسي باسم "store" وخمسة مجلدات فرعية تمثل كل من اللاعبين الرئيسيين في المتجر: "Actions" و "Effects" و "Redurs" و "Selectors" و "State".

إنشاء التخزين والقيم الأولية


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

قمنا بإنشاء واجهتين لتعريف المستخدم وتكوينه. لدينا أيضًا واحدًا لاستجابة HTTP للمستخدم ، إنه مجرد صفيف IUser.

صورة

صورة

لنبدأ بحالة المستخدم (store / state / user.state.ts):

صورة

ماذا نفعل هنا:

  1. نقوم بإنشاء وتصدير واجهة مع هيكل بيئة المستخدم.
  2. نفعل نفس الشيء مع حالة المستخدم الأولية ، التي تنفذ الواجهة التي تم إنشاؤها حديثًا.

بالنسبة لحالة التكوين ، نقوم بنفس الشيء (store / states / config.state.ts):

صورة

أخيرًا ، نحتاج إلى إنشاء حالة التطبيق (store / states / app.state.ts):

صورة

  1. تحتوي حالة التطبيق على حالة المستخدم وتكوينه ، بالإضافة إلى حالة جهاز التوجيه.
  2. ثم نقوم بتعيين الحالة الأولية للتطبيق.
  3. أخيرًا ، يتم تصدير الوظيفة للحصول على الحالة الأولية (سنستخدمها لاحقًا).

إنشاء الإجراءات


تأكد من قراءة تعريف العمل الذي ناقشناه في المقالة السابقة .
نحتاج إلى إنشاء إجراءات للمستخدمين والإعدادات. لنبدأ بإجراءات المستخدم (store / Actions / user.actions.ts): لنستعرض

صورة

الرمز قليلاً:

  1. Enum, . , , , .
  2. . Action ngrx. , , , .
  3. , , . , , , .

وهذا كل شيء ... إنشاء الإجراءات أمر سهل. دعنا نرى كيف تبدو إجراءات التكوين (store / Actions / config.actions.ts):

صورة

لا شيء جديد هنا ، ربما تشعر الآن بالراحة مع كل ما يحدث في هذا الملف.

رائع ، لقد حددنا بالفعل الحالة والإجراءات ... فلنقم بإنشاء التروس!

إنشاء علب التروس


تأكد من قراءة تعريف علب التروس التي ناقشناها في مقال سابق .
سيكون لدينا علب تروس تستجيب لبعض الإجراءات ، لأن البعض الآخر سيتم التعامل معه من خلال التأثيرات التي سننفذها لاحقًا.

نحن بحاجة إلى مخفض للمستخدمين وآخر للتكوين ، ولكننا نحتاج أيضًا إلى إنشاء مخفضات التطبيق ، فلنبدأ من خلال النظر إلى مخفضات المستخدمين (store / redurs / user.reducers.ts):

صورة

دعنا نناقش التنفيذ:

  1. يتلقى إعلان المخفض حالة ، وفي هذه الحالة ، يتخذ إجراء المستخدم ويعيد IUserState.
  2. باستخدام عبارة التبديل ، نقوم بإنشاء ملاحظات لكل نوع ممكن من الإجراءات.
  3. تُرجع كل حالة كائنًا جديدًا ، والذي ينتج عن اندماج الدولة القديمة والقيمة الجديدة.
  4. جميع علب التروس لها نتيجة افتراضية ، والتي ترجع ببساطة الحالة دون أي تغييرات.

وكل شيء. لن تجد أي شيء آخر في علبة التروس. دعنا نلقي نظرة على مخفضات التكوين (state / redurs / config.reducers.ts):

صورة

أخيرًا ، فلنلق نظرة على مخفضات التطبيق (المتجر):

صورة

هنا نضيف جميع المخفضات إلى خريطة مخفض التطبيق. نستخدم خريطة مخفض الإجراء للتحقق من النوع الإضافي. في وقت لاحق سنقوم بتزويد هذا التطبيق بمخفضات لوحدة المتجر.

إضافة تأثيرات


تأكد من قراءة تعريف "التأثيرات" الذي ناقشناه في مقال سابق .
ربما لاحظت بالفعل أننا لا نقوم بمعالجة جميع الإجراءات في علب التروس. هذا لأننا سنتعامل مع الإجراءات الفائتة في التأثيرات ، لأن هذه الإجراءات لها آثار جانبية.

لنبدأ بتأثيرات مخصصة (store / Effects / user.effects.ts):

صورة

الكثير مما يحدث في هذا الملف. دعونا نحاول شرحها:

  1. نعلن آثارنا المخصصة باستخدام الديكور حقن.
  2. نعلن آثارنا باستخدام تأثيرات الديكور التي تقدمها ngrx / Effects.
  3. باستخدام الإجراءات المقدمة من قبل ngrx / Effects ، سنبدأ في خط أنابيب مشغلنا لهذا التأثير.
  4. الخطوة التالية هي تعيين نوع إجراء التأثير باستخدام عامل ofType.
  5. الأجزاء التالية هي عوامل تشغيل rxjs التي نستخدمها للحصول على ما نحتاج إليه (لدينا بالفعل رابط إلى وثائق rxjs في هذه المقالة).
  6. أخيرًا ، في البيان الأخير ، سيرسل التأثير تأثيرًا آخر.
  7. في المُنشئ ، نقوم بتنفيذ الخدمات التي سنستخدمها ، وإجراءات لـ ngrx / Effects ، وفي هذه الحالة أيضًا المستودع (لاحظ أن هذا عرض توضيحي ، ونحصل على المستخدم المحدد من قائمة المستخدمين في مستودعنا).

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

ضع في اعتبارك تأثيرات التكوين (store / Effects / config.effects.ts):

صورة

حان الوقت الآن للتحدث عن المحددات ...


, .
ليس من المنطقي تكرار عينات التقطيع لحالتنا في كل مكان ، لذلك دعونا ننشئ بعض المحددات التي يمكننا إعادة استخدامها.

كما هو الحال دائمًا ، فلنلقِ نظرة أولاً على محددات المستخدم (store / selectors / user.selectors.ts):

صورة

هذا أمر مفهوم حقًا لأننا لا نقوم بأي تحويلات للبيانات في محدداتنا ، ولكن ببساطة نعيد شريحة المتجر التي أشار إليها المحدد باستخدام الوظيفة CreateSelector من ngrx / store.

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

دعونا نلقي نظرة على محددات التكوين (store / selectors / config.selectors.ts):

صورة

الإعداد النهائي


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

دعنا نضيف وحدة تطبيق:

صورة

ماذا فعلنا هنا:

  1. نحن نستورد علب التروس الخاصة بنا ونوفرها في وحدة تخزين الجذر.
  2. نستورد مؤثراتنا ونوفرها داخل المصفوفة في وحدة تأثيرات forRoot.
  3. قمنا بإعداد التكوين لوحدة الحالة لجهاز التوجيه التي توفر جهاز التوجيه stateKey.
  4. ونضيف أدوات مطوري المتاجر إذا كانت البيئة ليست إنتاجًا.

أول خطوتين ضروريتان ، في حين أن الخطوتين 3 و 4 أوصي بشدة ، لكنهما غير مطلوبين.

انتهينا الآن أخيرًا ... يمكننا استخدام التخزين في المكونات!

استخدام التخزين في بعض المكونات


نحن نقترب من النهاية! دعونا نرى كيفية استخدام التخزين لدينا ...

أولاً ، دعنا نحصل على التكوين عند بدء التطبيق:

صورة

  1. نحن نضيف مساحة تخزين إلى app.component لدينا.
  2. قمنا بتعيين خاصية المكون إلى قيمة المحدد في التكوين ، لأننا نريد عرض بعض هذه المعلومات بتنسيق HTML.
  3. في onInit ، نرسل الإجراء للحصول على التكوين.

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

كيفية ربط هذا بـ HTML:

صورة

بمجرد أن يكون لـ config $ قيمة ، سنراه في HTML.

الآن دعنا نرى قائمة المستخدمين (الحاويات / المستخدمين / users.component.ts):

صورة

  1. مثلما ندير التكوين ، سنحصل على قائمة المستخدمين. أولاً ، نقوم بحقن المستودع في مكون المستخدم.
  2. في onInit ، نقوم بنشر إجراء لجذب المستخدمين.
  3. نقوم بإنشاء خاصية للمكون وتعيينه قائمة المستخدمين باستخدام محدد قائمة المستخدمين.

يبدو HTML مثل هذا:

صورة

نعرض قائمة المستخدمين في مكون العرض التقديمي ، وإرسال القائمة وربط المستخدم المحدد بوظيفة التنقل التي يمكن رؤيتها في مكون حاوية المستخدم أعلاه.

دعونا نلقي نظرة على مكون الحاوية المخصص:

صورة

يتلقى هذا المكون معرف المعلمة من المسار المنشط ، ومن المحتمل أنك على دراية بالباقي ، ويرسل المعرّف كمعلمة ، ويحدد المستخدم المحدد ...

إذا قمت بتصحيح التطبيق ، يمكنك رؤية أدوات المطور ، وهي بسيطة للغاية لاستخدام ... ولكن في هذه المقالة درسنا ما يكفي ، وآمل أن تتمكن من اكتشاف هذه الأدوات بسهولة.

استنتاج


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

آمل حقًا أن تساعدك المقالة على فهم نموذج الإجراء وتوصي بتنزيله واللعب قليلاً مع الرمز.

All Articles