0Pricing
React Academy · درس

نمط محدد السياق

نفّذ hook بسيطًا للمحدد يعيد التصيير فقط عند تغير جزء من السياق.

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

مرحبًا

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

مشكلة المحدد

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

ما المحدد؟

المحدد هو دالة تستخرج جزءًا محددًا من الحالة من كائن حالة أكبر: `state => state.user.name`. يشترك hook المحدد في السياق، لكنه لا يؤدي إلى إعادة التصيير إلا عند تغير القيمة المحددة.

Hook محدد بسيط

أنشئوا hook باسم useSelector يقرأ السياق ويغلّفه داخل useMemo اعتمادًا على نتيجة المحدد. ولا يُعاد تصيير المكوّن إلا عند تغير القيمة المحددة.
function useAppSelector(selector) {
  const state = useContext(AppCtx);
  return useMemo(() => selector(state), [state, selector]);
}

// Consumer only re-renders when user.name changes
const name = useAppSelector(s => s.user.name);

فحص المساواة السطحية

يؤدي استخدام useMemo مع محدد إلى إعادة التصيير أيضًا إذا أعاد المحدد مرجعًا جديدًا لكائن أو مصفوفة في كل استدعاء، مثل `s => s.items.filter(...)`. استخدموا مقارنة مساواة سطحية لتجاوز إعادة التصيير عندما يكون المحتوى متطابقًا.
import { useRef } from 'react';

function useSelector(selector) {
  const state = useContext(AppCtx);
  const selected = selector(state);
  const ref = useRef(selected);
  if (!shallowEqual(ref.current, selected)) {
    ref.current = selected;
  }
  return ref.current;
}

مكتبة use-context-selector

للاستخدام في بيئة الإنتاج، توفر مكتبة **use-context-selector** hook باسم `useContextSelector` مع اشتراكات وفحوص مساواة فعّالة، من دون الحاجة إلى مديري حالة خارجيين.
import { useContextSelector } from 'use-context-selector';

const name = useContextSelector(AppCtx, s => s.user.name);

Zustand كحل أصلي للمحددات

يوفر hook `useStore(selector)` في Zustand دعمًا مدمجًا للمحددات مع مساواة سطحية جاهزة، مما يجعله مناسبًا طبيعيًا لأشجار الحالة الكبيرة التي تتطلب اشتراكات دقيقة.
const name = useAppStore(state => state.user.name);

متى تكون المحددات مبالغة

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

حفظ دوال المحددات مؤقتًا

إذا أنشأتم المحدد داخل جسم المكوّن، فسيحصل على مرجع دالة جديد في كل عملية تصيير، مما قد يعطل الحفظ المؤقت. عرّفوا المحددات خارج المكوّن أو استخدموا useCallback.
// Outside component — stable reference
const selectName = s => s.user.name;

function Profile() {
  const name = useAppSelector(selectName);
  return <p>{name}</p>;
}

المحددات المشتقة

ركّبوا المحددات باستدعاء أحدها من داخل آخر. تحسب المحددات المشتقة قيمًا من المحددات الأساسية، مما يُبقي منطق الأعمال خارج المكوّنات.
const selectFullName = s => s.user.firstName + ' ' + s.user.lastName;

تحقق سريع

لماذا ينبغي تعريف دوال المحددات خارج جسم المكوّن عند استخدامها مع useContextSelector أو useMemo؟

مراجعة

تستخرج المحددات جزءًا من حالة السياق وتمنع إعادة التصيير عند تغير الأجزاء غير المرتبطة. عرّفوا المحددات خارج المكوّنات للحفاظ على مراجع مستقرة. استخدموا use-context-selector أو Zustand للحصول على دعم محددات مناسب لبيئة الإنتاج.

التالي

الدرس التالي: **متى لا تستخدمون السياق** — ستتعلمون التعرّف على الحالات التي يكون فيها تمرير الخصائص أو التركيب أو مدير الحالة أنسب من Context.

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

هل درس «نمط محدد السياق» مجاني؟

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

ماذا ستتعلم في «نمط محدد السياق»؟

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

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

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

كم من الوقت يستغرق درس «نمط محدد السياق»؟

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

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

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

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

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