"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > الكود المصدري لـ useMemo:

الكود المصدري لـ useMemo:

تم النشر بتاريخ 2024-11-08
تصفح:714

The source code of useMemo:

هناك نوعان من الظروف: التحميل والتحديث، لذا فإن useMemo له تطبيقان: mountMemo و updateMemo.

  • الكود المصدري لـ mountMemo:

function mountMemo(
  nextCreate: () => T,
  deps: Array | void | null,
): T {
  const hook = mountWorkInProgressHook();
  const nextDeps = deps === undefined ? null : deps;
  const nextValue = nextCreate();
  if (shouldDoubleInvokeUserFnsInHooksDEV) {
    setIsStrictModeForDevtools(true);
    nextCreate();
    setIsStrictModeForDevtools(false);
  }
  hook.memoizedState = [nextValue, nextDeps];
  return nextValue;
}


توضيح:
في مرحلة التحميل، تستدعي الدالة useMemo دالة رد الاتصال لحساب القيمة وإرجاعها. احفظ القيمة وتوجه إلى ملف Hook.memoizedState.

  1. استخدم mountWorkInProgressHook لإنشاء كائن ربط.

  2. احفظ deps في nextDeps.

  3. اتصل بـ nextCreate () للحصول على nextValue. إذا كنت في بيئة تطوير، اتصل مرتين.

  4. احفظ القيمة التالية وnextDeps في الخطاف.memoizedStateوإرجاع القيمة التالية.

  • الكود المصدري لـ updateMemo:

function updateMemo(
  nextCreate: () => T,
  deps: Array | void | null,
): T {
  const hook = updateWorkInProgressHook();
  const nextDeps = deps === undefined ? null : deps;
  const prevState = hook.memoizedState;
  // Assume these are defined. If they're not, areHookInputsEqual will warn.
  if (nextDeps !== null) {
    const prevDeps: Array | null = prevState[1];
    if (areHookInputsEqual(nextDeps, prevDeps)) {
      return prevState[0];
    }
  }
  const nextValue = nextCreate();
  if (shouldDoubleInvokeUserFnsInHooksDEV) {
    setIsStrictModeForDevtools(true);
    nextCreate();
    setIsStrictModeForDevtools(false);
  }
  hook.memoizedState = [nextValue, nextDeps];
  return nextValue;
}


توضيح:
في مرحلة التحديث، ستحكم React على ما إذا كانت عمليات الحذف قد تغيرت أم لا، وإذا تغيرت، ستقوم React بتشغيل رد الاتصال للحصول على القيمة الجديدة والعودة. إذا لم يتم تغييرها، فسوف تُرجع React القيمة القديمة.

  1. الحصول على كائن ربط جديد: Hook = updateWorkInProgressHook();
  2. إذا كانت صفيف deps فارغًا إذا (nextDeps !== null)، فاستدعاء وظيفة رد الاتصال في كل عرض وإرجاع قيمة جديدة.
  3. إذا لم تكن مصفوفة deps فارغة، فاحكم على ما إذا كانت deps قد تغيرت أم لا إذا (areHookInputsEqual(nextDeps, prevDeps)). إذا لم يتم تغييرها، قم بإرجاع القيمة القديمة return prevState[0].
بيان الافراج يتم استنساخ هذه المقالة على: https://dev.to/clara1123/the-source-code-of-usememo-5akk؟1 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3