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

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

المنصة

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

الحساب

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

روابط

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

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

صُنع بـ في مصر

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

منهج React Js

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

كل اللغات
مدرسة البرمجة/منهج React Js/تحسين الأداء ومشاركة المعالجة عبر useMemo و useCallback

تحسين الأداء ومشاركة المعالجة عبر useMemo و useCallback

شرح useMemo في ريأكتشرح useCallback في ريأكتتحسين أداء Reactالفرق بين useMemo و useCallbackالتخزين المؤقت React PerformanceMemoization Optimization

الشرح

عندما يعاد رسم (Re-render) المكون في React، يتم تنفيذ كل سطر برلمجي بداخله من جديد:

  1. تُعاد جميع الحسابات الرياضية والعمليات البرمجية المعقدة.
  2. تُنشأ جميع الدوال المعرفة داخل المكون بمرجع جديد في الذاكرة (New Reference).

في التطبيقات الضخمة، قد يؤدي ذلك إلى إبطاء الواجهة وتأخير استجابتها. لتفادي هذه المشكلة، تعتمد ريأكت على تقنية Memoization (التخزين المؤقت) لمنع تكرار العمليات دون داعٍ.

1. هوك useMemo: تخزين نتائج الحسابات المجهدة

يُستخدم useMemo لمنع إعادة تشغيل المعالجات الحسابية الثقيلة طالما أن مدخلاتها لم تتغير.

javascript
1import { useMemo } from 'react';
2
3function CourseList({ courses, filterTerm }) {
4 // ⚠️ عدم استخدام useMemo يعيد الفلترة المجهدة مع كل رندرة للمكون
5 // ✅ تخزين النتيجة: لن تُنفذ الفلترة إلا عند تغير [courses, filterTerm]
6 const filteredCourses = useMemo(() => {
7 return courses.filter((c) => c.title.includes(filterTerm));
8 }, [courses, filterTerm]);
9
10 return (
11 <ul>
12 {filteredCourses.map((c) => (
13 <li key={c.id}>{c.title}</li>
14 ))}
15 </ul>
16 );
17}

2. هوك useCallback: تثبيت مرجع الدوال في الذاكرة

في جافا سكريبت، () => {} === () => {} تُرجع false لأن مراجع الذاكرة مختلفة! عند تمرير دالة إلى مكون ابن، يظن الابن أن البيانات تغيرت فيعيد رسم نفسه. يقوم useCallback بتخزين مرجع الدالة نفسه وتثبيته في الذاكرة طالما لم تتغير مصفوفة التبعيات.

javascript
1import { useState, useCallback } from 'react';
2
3function ParentComponent() {
4 const [count, setCount] = useState(0);
5
6 // تثبيت مرجع الدالة لتجنب إعادة خلقها في كل رندرة للأب
7 const handleDelete = useCallback((id) => {
8 console.log('حذف العنصر رقم:', id);
9 }, []); // مصفوفة فارغة تعني تثبيت المرجع طوال حياة المكون
10
11 return (
12 <div>
13 <button onClick={() => setCount(count + 1)}>زيادة العداد ({count})</button> <ExpensiveChild onDelete={handleDelete} />
14 </div>
15 );
16}

3. متى نجمع بين useCallback و React.memo؟

استخدام useCallback بمفرده لا يمنع المكون الابن من إعادة الرندرة! يجب تغليف المكون الابن بـ React.memo ليقرأ المرجع الميثق ويمتنع عن الرندرة:

javascript
1import { memo } from 'react';
2
3// المكون لن يعاد رسمه عند تغير عداد الأب بفضل تثبيت مرجع onDelete
4const ExpensiveChild = memo(({ onDelete }) => {
5 console.log('رندرة المكون الابن...');
6 return <button onClick={() => onDelete(1)}>حذف</button>;
7});

تحذير تحسين الأداء المبكر (Premature Optimization)!

⚠️ تحذير

لا تقم بتغليف كل دالة بـ useCallback وكل حساب بـ useMemo عشوائياً!

ℹ️ معلومة

السبب: الهوكس نفسها تحجز مساحة في الذاكرة وتستهلك معالجة لمقارنة التبعيات (Dependency Array Comparison) في كل رندرة. إذا كانت العملية بسيطة، ستكون تكلفة تشغيل الهوك أعلى من تكلفة إعادة العمل البسيط نفسه!

  • استخدم useMemo فقط للعمليات المعقدة جداً (مثل الفلترة في آلاف العناصر، أو المعالجات الرياضية المجهدة).
  • استخدم useCallback فقط عندما تمرر الدالة كـ Prop لمكون فرعي مغلف بـ React.memo لمنع إعادة رندرته.

الدرس السابق

دورة الحياة للذاكرة والوصول لعناصر الـ DOM عبر useRef

الدرس التالي

Advanced Form Handling & Dynamic Validation

نوفيل

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

المنصة

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

الحساب

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

روابط

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

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

صُنع بـ في مصر