React Academy · درس

إعادة هيكلة HOC إلى Custom Hook

حوّل withAuth HOC إلى useAuth hook خطوة بخطوة.

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

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

مرحبًا

في هذا الدرس ستعيد هيكلة HOC باسم withAuth إلى Custom Hook باسم useAuth خطوةً بخطوة، وسترى تحديدًا لماذا تكون نسخة hook أنظف وأسهل في الاختبار.

HOC باسم withAuth، نقطة البداية

يستقبل HOC مكوّنًا، ويتحقق مما إذا كان المستخدم مصادقًا عليه، ويعيد التوجيه إلى /login إذا لم يكن كذلك. كما يحقن المستخدم باعتباره prop.
function withAuth(Component) {
  return function AuthGuard(props) {
    const { user, loading } = useAuthState();
    if (loading) return <Spinner />;
    if (!user) return <Navigate to="/login" />;
    return <Component {...props} user={user} />;
  };
}

const ProtectedPage = withAuth(MyPage);

مشكلات HOC

يؤدي HOC إلى: (1) إضافة غلاف في DevTools، (2) حقن prop باسم `user` ضمنيًا — لذا يجب أن يعرف المكوّن أنه يتوقعه، (3) صعوبة اختباره من دون تصيير غلاف HOC كامل، (4) صعوبة تركيبه مع hooks أخرى.

الخطوة 1: استخراج المنطق إلى Hook

انقل كل المنطق من HOC إلى Custom Hook. تُرجع hook حالة المصادقة مباشرةً — من دون تغليف أو حقن للخصائص.
function useAuth() {
  const { user, loading } = useAuthState();
  return { user, loading, isAuthenticated: !!user };
}

الخطوة 2: معالجة عمليات إعادة التوجيه في Hook

انقل منطق إعادة التوجيه إلى hook منفصلة، مثل useRequireAuth، تستدعي navigate داخليًا وتُرجع المستخدم.
function useRequireAuth(redirectTo = '/login') {
  const { user, loading } = useAuth();
  const navigate = useNavigate();

  useEffect(() => {
    if (!loading && !user) navigate(redirectTo);
  }, [user, loading, navigate, redirectTo]);

  return { user, loading };
}

الخطوة 3: تحديث المكوّن

استبدل غلاف HOC باستدعاء hook مباشر داخل المكوّن. يستدعي المكوّن useRequireAuth صراحةً ويتعامل مع التحميل. وأصبح الاعتماد الآن ظاهرًا.
function MyPage() {
  const { user, loading } = useRequireAuth();
  if (loading) return <Spinner />;
  return <p>Hello, {user.name}</p>;
}

مقارنة الفوائد

تتميّز نسخة hook بما يلي: (1) لا يوجد غلاف إضافي في DevTools، (2) اعتماد صريح — يمكنك رؤية `useRequireAuth` في المكوّن، (3) سهولة الاختبار عبر محاكاة hook، (4) قابلية التركيب مع hooks أخرى في المكوّن نفسه.

اختبار نسخة Hook

حاكِ useRequireAuth في اختبارك باستبدال تصدير الوحدة الخاص بها. ولا يحتاج اختبار المكوّن إلا إلى تصيير المكوّن والتحقق من الناتج — من دون إعداد HOC.
vi.mock('./useRequireAuth', () => ({
  useRequireAuth: () => ({ user: mockUser, loading: false })
}));

render(<MyPage />);
expect(screen.getByText('Hello, Alice')).toBeInTheDocument();

متى تحتفظ بـ HOC

احتفظ بـ HOC إذا كنت تحتاج إلى حماية العديد من المكوّنات بطريقة تعريفية، مثلًا في تعريفات المسارات، ولا تريد إضافة استدعاء hook إلى كل مكوّن. يمكنك حتى إنشاء HOC فوق hook.
function withAuth(Component) {
  return function (props) {
    const { user, loading } = useRequireAuth();
    if (loading) return <Spinner />;
    return <Component {...props} user={user} />;
  };
}

أفضل ما في الطريقتين

البنية النهائية هي: hook باسم useRequireAuth للاستخدام المباشر داخل المكوّنات، وHOC رقيق باسم withAuth مبني فوقها لحماية المسارات بطريقة تعريفية. ويشترك كلاهما في منطق hook نفسه.

اختبار سريع

ما الفائدة الرئيسية من استدعاء useRequireAuth داخل المكوّن بدلًا من تغليفه بـ HOC باسم withAuth؟

مراجعة

أعد هيكلة HOCs إلى hooks باستخراج المنطق إلى Custom Hook، ونقل الآثار الجانبية، مثل عمليات إعادة التوجيه، إلى hook، ثم استدعاء hook مباشرةً في المكوّن. أنشئ HOC رقيقًا فوق hook عندما تكون الحاجة إلى التغليف التعريفي قائمة.

اكتمل المقرر

تهانينا! لقد أتممت **React Patterns: Render Props & HOCs**. أصبحت الآن تفهم كلا النمطين الكلاسيكيين، والمفاضلات بينهما، وكيفية إعادة هيكلتهما إلى Custom Hooks حديثة.
البدء مجانًا

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

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

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

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

هل درس «إعادة هيكلة HOC إلى Custom Hook» مجاني؟

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

ماذا ستتعلم في «إعادة هيكلة HOC إلى Custom Hook»؟

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

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

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

كم من الوقت يستغرق درس «إعادة هيكلة HOC إلى Custom Hook»؟

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

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

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

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

  1. نمط Render Props
  2. شرح المكوّنات عالية الرتبة (HOCs)
  3. HOC مقابل Render Props مقابل Custom Hooks
  4. إعادة هيكلة HOC إلى Custom Hook
← العودة إلى React Academy