0Pricing
React Academy · درس

المكوّنات النقية وتجنّب الآثار الجانبية أثناء التصيير

اكتبوا دوال تصيير خالية من التعديلات وقراءات المصادر الخارجية

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

مرحباً

في هذا الدرس ستتعلّم معنى المكوّن النقي في React، ولماذا يجب أن تكون دوال التصيير خاليةً من الآثار الجانبية، وكيف تكتشف انتهاكات النقاء الشائعة وتصلحها.

ما هي الدالة النقية؟

تعيد الدالة النقية دائماً الناتج نفسه للمدخلات نفسها، ولا تُحدث أي آثار جانبية يمكن ملاحظتها. يتوقع React أن تكون دالة المكوّن نقية: فإذا كانت الخصائص والحالة متماثلتين، فعليها أن تعيد JSX نفسه دائماً.

لماذا يهم النقاء في React؟

قد يستدعي React المكوّن عدة مرات، بسبب StrictMode أو الميزات المتزامنة أو التصيير على الخادم. فإذا احتوى التصيير على آثار جانبية مثل استدعاءات API أو تعديلات DOM أو الكتابة في متغيرات عامة، فستُنفَّذ هذه الآثار عدة مرات وبشكل غير متوقّع.

أحد أشكال عدم النقاء الشائعة: تعديل الحالة الخارجية

لا تعدّل أبداً المتغيرات المعرّفة خارج المكوّن أثناء التصيير. التعديلات مقبولة داخل معالجات الأحداث أو useEffect، لكن ليس أثناء التصيير.
let totalRenders = 0; // external
function Counter() {
  totalRenders++; // BAD: side effect in render
  return <p>{totalRenders}</p>;
}

أحد أشكال عدم النقاء الشائعة: تعديل الخصائص

لا تعدّل كائن الخصائص داخل المكوّن أبداً. فالخصائص للقراءة فقط. وإذا احتجت إلى نسخة معدّلة، فأنشئ متغيراً جديداً.
// Bad
function Badge({ user }) {
  user.name = user.name.toUpperCase(); // mutates prop!
  return <p>{user.name}</p>;
}

// Good
function Badge({ user }) {
  const displayName = user.name.toUpperCase();
  return <p>{displayName}</p>;
}

أحد أشكال عدم النقاء الشائعة: استخدام العشوائية أو التاريخ أثناء التصيير

يؤدي استدعاء `Math.random()` أو `Date.now()` مباشرةً أثناء التصيير إلى إنتاج قيم مختلفة في كل استدعاء، مما يخرق النقاء. انقل هذه القيم إلى مهيئات الحالة أو useEffect.
// Bad
function Token() {
  const id = Math.random(); // different every render!
  return <p>{id}</p>;
}

// Good
function Token() {
  const [id] = useState(() => Math.random());
  return <p>{id}</p>;
}

مكان استدعاءات API هو useEffect

يُعد جلب البيانات مباشرةً داخل جسم دالة المكوّن، بدلاً من وضعه في useEffect، شكلاً من عدم النقاء — إذ يُشغَّل في كل عملية تصيير. انقل استدعاءات الجلب دائماً إلى useEffect مع التبعيات المناسبة.
// Bad
function Profile({ id }) {
  fetch('/api/user/' + id); // runs on every render!
  return <div />;
}

// Good
useEffect(() => {
  fetch('/api/user/' + id).then(/*...*/);
}, [id]);

التعديلات المحلية مقبولة

يُعد إنشاء الكائنات والمصفوفات التي أُنشئت *داخل* عملية التصيير نفسها وتعديلها أمراً مقبولاً تماماً — فلا يستطيع أي طرف آخر ملاحظتها. ويُسمّى ذلك تعديلاً محلياً.
function List({ items }) {
  const sorted = [...items]; // new array
  sorted.sort();             // mutating a local copy: OK
  return sorted.map(i => <li key={i}>{i}</li>);
}

استخدام Strict Mode للعثور على حالات عدم النقاء

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

المكوّنات النقية وReact.memo

عندما يكون المكوّن نقياً (الخصائص نفسها ← الناتج نفسه)، فإن تغليفه باستخدام `React.memo` يخبر React بإمكانية تخطّي إعادة التصيير إذا لم تتغير الخصائص، مما يحسّن الأداء.
const Pure = React.memo(function Pure({ value }) {
  return <p>{value}</p>;
});

تحقّق سريعاً

أيّ مما يلي يُعد أثراً جانبياً مقبولاً لتنفيذه مباشرةً داخل دالة تصيير مكوّن React؟

مراجعة

تعيد المكوّنات النقية JSX نفسه دائماً للمدخلات نفسها. تجنّب تعديل الخصائص أو المتغيرات الخارجية أثناء التصيير، واستخدم useEffect للآثار الجانبية، واعتمد على StrictMode لاكتشاف الانتهاكات.

التالي

الدرس التالي: **أفضل ممارسات Key وRef** — ستستخدم المفاتيح الثابتة بطريقة صحيحة، وتتجنب مشكلة استخدام الفهرس كمفتاح، وتتعامل مع مراجع callback.

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

هل درس «المكوّنات النقية وتجنّب الآثار الجانبية أثناء التصيير» مجاني؟

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

ماذا ستتعلم في «المكوّنات النقية وتجنّب الآثار الجانبية أثناء التصيير»؟

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

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

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

كم من الوقت يستغرق درس «المكوّنات النقية وتجنّب الآثار الجانبية أثناء التصيير»؟

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

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

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

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

  1. ما الذي يفعله StrictMode
  2. المكوّنات النقية وتجنّب الآثار الجانبية أثناء التصيير
  3. أفضل ممارسات Key وRef
  4. بنية المجلدات واصطلاحات التسمية
← العودة إلى React Academy