نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
AN

منهج Angular

دليل مرجعي شامل

كل اللغات
مدرسة البرمجة/منهج Angular /استخدام استراتيجية OnPush لتحسين أداء المكونات

استخدام استراتيجية OnPush لتحسين أداء المكونات

ستراتيجية OnPushداء المكوناتتحسين الأداءAngular 22.1ChangeDetectionStrategy.OnPush

جدول مرجعي سريع

1
مقياس الأداء والمقارنةالاستراتيجية الافتراضية (Default Change Detection)استراتيجية الأداء المحسن (OnPush Strategy)
متى يتم فحص المكون؟مع كل حدث غير متزامن في التطبيق (نقرات، مؤقتات، حركات ماوس)فقط عند تغيير خصائص الإدخال (Inputs)، وقوع حدث داخل المكون، أو تغيير إشارة مرتبطة به
معدل استهلاك المعالج والذاكرةأعلى، نظراً لعمليات الفحص المتكررة لكل شجرة المكوناتأقل بكثير، لتخطي المكونات المستقرة وعدم فحصها بلا داعٍ
التوافق مع المكونات الكبرىيسبب بطئاً ملحوظاً في التطبيقات الضخمة وذات البيانات المتعددةمثالي جداً للتطبيقات الكبرى ورفع سرعة الاستجابة وتجربة المستخدم
طريقة الإعلان في الكود@Component({ ... }) بدون تحديد الاستراتيجية@Component({ changeDetection: ChangeDetectionStrategy.OnPush... })

الشرح

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

تفصيل فلسفة وعمل استراتيجية OnPush وكيفية تفعلها

مفهوم الكائنات غير القابلة للتغيير (Immutability) والإشارات:

لكي تنجح استراتيجية OnPush في عملها، فإنها تفترض أن بيانات المكون (Inputs) لا تتغير بطريقة التعديل المباشر (Mutation)، بل بتمرير مراجع جديدة كلياً أو الاعتماد على نظام الإشارات (Signals) الحديث. عندما تتغير الإشارة المرتبطة بمكون OnPush، يتعرف أنجولر فوراً على وجوب تحديث هذا المكون وتخطى باقي أجزاء الشجرة المستقرة.

حالات إعادة فحص مكون OnPush:

تغير قيمة الـ Input:

إذا تلقى المكون مرجعاً جديداً لخاصية إدخال (@Input()) من المكون الأب.

وقوع حدث داخلي:

إذا ضغط المستخدم على زر أو تفاعل مع عنصر DOM يقع حصراً داخل هذا المكون أو أبنائه.

تغير إشارة (Signal):

إذا كانت الإشارات المستخدمة داخل قوالب أو منطق المكون قد حدثت قيمتها.

الاستدعاء اليدوي:

عبر استخدام مرجع كاشف التغييرات (ChangeDetectorRef.markForCheck()).

أمثلة برمجية: تحويل مكون ليعمل باستراتيجية OnPush

المثال الأول: بناء مكون فرعي يعتمد على OnPush للتعامل مع البيانات المعزولة

typescript
1import { Component, Input, ChangeDetectionStrategy, signal } from '@angular/core';
2
3@Component({
4 selector: 'app-onpush-child',
5 standalone: true,
6 changeDetection: ChangeDetectionStrategy.OnPush, // تفعيل استراتيجية OnPush للأداء العالي
7 template: `
8 <div class="card-onpush">
9 <h4>المكون الفرعي (OnPush)</h4>
10 <p>العنوان المستقبل من الأب: <strong>{{ title }}</strong></p>
11 <p>العداد المحلي (عبر إشارة): <strong>{{ localCounter() }}</strong></p>
12
13 <button (click)="incrementLocal()">زيادة العداد المحلي</button>
14 </div>
15 `
16})
17export class OnPushChildComponent {
18 @Input() title = '';
19
20 // الإشارات تتوافق بسلاسة تامة مع OnPush وتحدث المكون تلقائياً عند تغيرها
21 localCounter = signal(0);
22
23 incrementLocal() {
24 this.localCounter.update(c => c + 1);
25 }
26}

أمثلة برمجية: ربط المكون الأب بالمكون الفرعي OnPush ومراقبة التحديثات

المثال الثاني: المكون الرئيسي الذي يتحكم في تمرير البيانات للمكون الفرعي المحسن

typescript
1import { Component, signal } from '@angular/core';
2import { OnPushChildComponent } from './onpush-child.component';
3
4@Component({
5 selector: 'app-onpush-parent',
6 standalone: true,
7 imports: [OnPushChildComponent],
8 template: `
9 <div class="parent-box">
10 <h3>المكون الرئيسي (Parent Component)</h3>
11 <p>رقم الإصدار الحالي: <strong>{{ appVersion() }}</strong></p>
12
13 <!-- تمرير البيانات للمكون الفرعي OnPush -->
14 <app-onpush-child [title]="appVersion()"></app-onpush-child>
15
16 <button (click)="updateVersion()">تحديث الإصدار (تغيير الـ Input)</button>
17 </div>
18 `
19})
20export class OnPushParentComponent {
21 appVersion = signal('Angular v22.1.0-beta');
22
23 updateVersion() {
24 // تغيير القيمة يرسل مرجعاً جديداً للمكون الفرعي، مما يحفز OnPush لتحديثه
25 this.appVersion.set('Angular v22.1.1-final');
26 }
27}

نصائح احترافية

  • —اعتمد على استراتيجية OnPush مع الإشارات (Signals) في كافة مكونات تطبيقك المستقلة!
  • —دمج ChangeDetectionStrategy.OnPush مع نظام الإشارات يلغي الحاجة للتدخل اليدوي عبر ChangeDetectorRef تماماً، ويمنحك بنية برمجية فائقة السرعة تستهلك الحد الأدنى من موارد المتصفح وتضمن استجابة فورية للمستخدم.

الدرس السابق

فهم آلية اكتشاف التغييرات

الدرس التالي

إيقاف آلية اكتشاف التغييرات يدوياً

نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر