Effect Pitfalls مزالق الـ Effect الشائعة
آخر تحديث: 2026-11-03
Effect Pitfalls مزالق الـ Effect الشائعة
تتركّز مزالق useEffect حول مصفوفة الاعتمادات: اعتماد ناقص يقرأ قيمة قديمة، واستدعاء setState داخل Effect يُحدِث عنه اعتماد يسبّب حلقة لا نهائية، واعتماد على كائن أو دالة يكون مرجعًا جديدًا كل مرة، ونسيان التنظيف يكدّس المستمعين. أدرك هذه الأصناف الأربعة يصبح معظم الـ Effects آمنًا، لأن جسم الـ Effect أخيرًا لا يفعل إلا ما يعد به اسمه.
| المجموعة | التوجيه وإدارة الحالة |
|---|---|
| النوع | نمط |
ℹ️ ملاحظة يحوّل المحرّر JSX إلى JavaScript ويعرض الواجهة الحقيقية داخل بيئة معزولة؛ تُركَّب المكوّنات تلقائياً دون استدعاء render يدوي.
📝 الصيغة
useEffect(() => {
document.title = 'Current ' + count + ' times' // ① if you use count, declare it as a dependency
}, [count]) // ② dependency array: re-run only when it changes
useEffect(() => {
const id = setInterval(tick, 1000)
return () => clearInterval(id) // ③ clean up on unmount to avoid stacking
}, [])
القيمة المرجعة:لا قيمة مرجعة؛ إنها نمط برمجي وليست واجهة قابلة للاستدعاء.
▶ مثال
المثال يعمل مباشرة: يُعرض تلقائياً عند التوسيع وتظهر التعديلات فوراً.
الناتج:
تتحدّث القائمة أثناء الكتابة، ولا يزيد عداد تنفيذ الـ Effect إلا عند تغيّر query؛ ويلخّص أدناه نتائج المزالق الكبرى الثلاث: اعتماد ناقص، وحلقة لا نهائية، واعتماد على كائن.
💡 النقاط الأساسية
⚠️ تحذير تحديث الحالة داخل Effect بينما تلك الحالة نفسها اعتماد هو المصدر الأول للحلقات اللانهائية؛ فاسأل نفسك أولًا «هل يمكن اشتقاق هذه القيمة أثناء الرسم؟».
💡 نصيحة اعتمادات الكائنات والمصفوفات والدوال مراجع جديدة في كل رسم — غلّفها بـ useMemo/useCallback، أو اضغط الاعتماد إلى قيمة أولية.
ℹ️ ملاحظة في بيئة التطوير، يعيد React 18 في StrictMode تركيب كل Effect وفكّه وتركيبه عمدًا، مما يكشف لك التنظيفات الناقصة.
🏷️ المزيد من التوجيه والحالة
💡 حالات ذات صلة
المزيد من الحالات قريباً.
📚 دروس ذات صلة
useEffect ودورة الحياة
الدرس 9: متى تُنفَّذ الـ Effects وجولة منهجية في دالة التنظيف.
قواعد الـ Hooks ومزالقها
الدرس 15: القائمة الكاملة لترتيب مصفوفة الاعتمادات وتصحيحها.
❓ الأسئلة الشائعة
س لماذا يدور Effect الخاص بي إلى الأبد؟
ج setState داخل Effect يغيّر قيمة هي أيضًا اعتماد -> تتغير الحالة -> يُنفَّذ Effect مجددًا -> يعيد تعيين الحالة، وهكذا. أصلحه بإزالة ذلك الاعتماد، أو بضغط قائمة الاعتمادات، أو باشتقاق القيمة أثناء الرسم.
س ماذا ينبغي وضعُه في مصفوفة الاعتمادات تحديدًا؟
ج كل قيمة تفاعلية يقرأها Effect: props والحالة والمتغيّرات والدوال المعرّفة داخل المكوّن. وتذكّرك قاعدة exhaustive-deps في eslint بالتي تنساها.
س هل يعني المصفوفة الفارغة [] أنه يُنفَّذ مرة واحدة؟
ج تعني «مستقلاً عن أي قيمة»: يُنفَّذ مرة عند التركيب ويُنفَّذ التنظيف عند فكّ التركيب. وإن كان يقرأ حالةً داخليًا فسيبقى يرى القيمة الأولية — فخ الإغلاق.