React Academy · درس

تقسيم السياقات للحد من إعادة التصيير

افصل القيم التي تتغير باستمرار عن القيم المستقرة وضع كل مجموعة في سياق مختلف.

الدرس 1 من 413 خطوة

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

مرحبًا

في هذا الدرس، ستتعلمون تقسيم سياقات React إلى موفّرين منفصلين لتقليل عمليات إعادة التصيير عندما يتغير جزء واحد فقط من قيمة السياق.

مشكلة إعادة التصيير مع السياق

كل مكوّن يستدعي useContext(MyCtx) يُعاد تصييره عند تغيّر أي جزء من قيمة السياق، حتى إن لم يتغير الجزء الذي يستخدمه. وقد يؤدي سياق واحد كبير إلى عمليات إعادة تصيير كثيرة غير ضرورية.

التقسيم حسب تكرار التحديث

افصلوا القيم التي تتغير باستمرار عن القيم التي نادرًا ما تتغير. ضعوا كل مجموعة في سياق مستقل. يشترك المستهلكون فقط في السياق الذي يحتاجون إليه.
const ThemeCtx = createContext('light');
const UserCtx = createContext(null);
// theme changes rarely; user changes on login/logout — same frequency is fine
// but notifCount changes every second — split it out!

فصل سياقي البيانات وDispatch

من الأنماط الشائعة تقسيم السياق إلى سياق لبيانات الحالة، يُعاد تصييره عند كل تغيير، وسياق آخر لدوال dispatch/setter، وهي مستقرة ولا تؤدي إلى إعادة تصيير المستهلكين. ولا يُعاد تصيير المستهلكين الذين يستخدمون dispatch فقط عند تغير البيانات.
const CountCtx = createContext(0);
const SetCountCtx = createContext(() => {});

function Provider({ children }) {
  const [count, setCount] = useState(0);
  return (
    <CountCtx.Provider value={count}>
      <SetCountCtx.Provider value={setCount}>
        {children}
      </SetCountCtx.Provider>
    </CountCtx.Provider>
  );
}

حفظ سياق Dispatch مؤقتًا

تظل دوال Setter من useState مستقرة، أي تحمل المرجع نفسه في كل عملية تصيير، ولذلك لا تتغير قيمة سياق dispatch. ولكن إذا أنشأتم كائنًا من الإجراءات، فغلّفوه داخل useMemo.
const actions = useMemo(() => ({
  increment: () => setCount(c => c + 1),
  reset: () => setCount(0),
}), []); // stable — empty deps

الموفّرون المتداخلون

ضمّنوا عدة موفّرين داخل شجرة المكوّنات. يستورد المستهلكون السياق المحدد الذي يحتاجون إليه ويستخدمونه فقط، مما يحافظ على نطاق ضيق للاشتراكات.
function App() {
  return (
    <AuthProvider>
      <ThemeProvider>
        <NotificationsProvider>
          <Router />
        </NotificationsProvider>
      </ThemeProvider>
    </AuthProvider>
  );
}

تحليل الأداء قبل التقسيم

حلّلوا الأداء دائمًا باستخدام React DevTools قبل تقسيم السياقات. لا تمثل عمليات إعادة التصيير غير الضرورية مشكلة إلا إذا كانت مكلفة. لا تبالغوا في تصميم السياقات التي تُعاد تصييرها بسرعة.

مقايضات تقسيم السياق

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

الدمج مع React.memo

حتى مع استخدام سياق واحد، فإن تغليف المكوّنات الفرعية المكلفة داخل React.memo يعني أنها لن تُعاد تصييرها إلا عند تغير الخصائص الخاصة بها، وليس عند تغير السياق. وقد يكون ذلك بديلًا أبسط من التقسيم.
const ExpensiveChild = React.memo(function({ label }) {
  return <div>{label}</div>;
}); // won't re-render on context change if label hasn't changed

useReducer + السياق

اجمعوا بين useReducer والسياق لإدارة الحالة المعقدة. خزّنوا الحالة في سياق واحد، ودالة dispatch في سياق آخر. يظل dispatch مستقرًا، بينما تتحدث الحالة عند كل إجراء.

تحقق سريع

لماذا يؤدي تقسيم الحالة وdispatch إلى سياقين منفصلين إلى تحسين الأداء؟

مراجعة

قسّموا السياقات حسب تكرار التحديث: ضعوا الحالة التي تتغير باستمرار في سياق، وdispatch/setters المستقرة في سياق آخر. حلّلوا الأداء أولًا، ولا تقسّموا إلا عند وجود فائدة فعلية، وفكّروا في React.memo كبديل أبسط.

التالي

الدرس التالي: **حفظ قيم السياق مؤقتًا باستخدام useMemo** — ستغلّفون كائنات قيم السياق داخل useMemo حتى لا يُعاد تصيير المستهلكين عند عدم تغير البيانات.
البدء مجانًا

تعلم React مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
88
الدروس
324

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

هل درس «تقسيم السياقات للحد من إعادة التصيير» مجاني؟

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

ماذا ستتعلم في «تقسيم السياقات للحد من إعادة التصيير»؟

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

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

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

كم من الوقت يستغرق درس «تقسيم السياقات للحد من إعادة التصيير»؟

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

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

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

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

  1. تقسيم السياقات للحد من إعادة التصيير
  2. حفظ قيم السياق مؤقتًا باستخدام useMemo
  3. نمط محدد السياق
  4. متى لا تستخدم Context
← العودة إلى React Academy