جاري التحميل...
جاري التحميل...
التعامل مع الآثار الجانبية
useEffect هو خطاف يسمح لك بتشغيل التأثيرات الجانبية في مكونات الدالة. ينفذ العمليات بعد العرض.
💡 تشبيه بسيط:
useEffect مثل البريد الوارد. كلما وصل بريد جديد (تغيير في التبعيات)، تفتح الصندوق (تنفذ الدالة). إذا حدّدت شروطاً (مصفوفة التبعيات)، فتح الصندوق فقط عندما تتحقق الشروط. بدون شروط، تفتحه كل مرة.
التأثيرات الجانبية هي عمليات مثل: جلب البيانات من API، إعداد اشتراكات، مؤقتات، أو تعديل DOM مباشر.
الصيغة الأساسية: useEffect(() => {}, [])
المعامل الثاني لـ useEffect هو مصفوفة التبعيات التي تتحكم في متى يُنفذ التأثير.
واحدة من أكثر استخدامات useEffect شيوعاً هي جلب البيانات من API.
💡 مهم:
تعامل دائماً مع حالات التحميل والأخطاء عند جلب البيانات.
يمكن لـ useEffect إرجاع دالة تنظيف تُنفذ قبل إعادة تشغيل التأثير أو عند فك تثبيت المكون.
هذا ضروري لتنظيف الاشتراكات أو المؤقتات أو مستمعي الأحداث.
متى يُنفذ useEffect بمصفوفة تبعيات فارغة []؟
ما هو الغرض من دالة التنظيف في useEffect؟
لماذا لا يجب استخدام الدوال غير المتزامنة مباشرة في useEffect؟
ماذا يحدث إذا نسيت مصفوفة التبعيات؟
أنشئ مكوناً يجلب ويعرض البيانات من API مع حالات التحميل والأخطاء.
الحل:
function AdvancedTimer() {
const [seconds, setSeconds] = useState(60);
const [isRunning, setIsRunning] = useState(false);
useEffect(() => {
if (!isRunning || seconds === 0) return;
const interval = setInterval(() => {
setSeconds(prev => prev - 1);
}, 1000);
return () => clearInterval(interval);
}, [isRunning, seconds]);
return (
<div>
<h2>الوقت المتبقي: {seconds} ثانية</h2>
<button onClick={() => setIsRunning(!isRunning)}>
{isRunning ? "إيقاف" : "تشغيل"}
</button>
<button onClick={() => { setSeconds(60); setIsRunning(false); }}>
إعادة تعيين
</button>
</div>
);
}المفاهيم الأساسية:
الأوامر:
متى يُنفذ useEffect بدون مصفوفة تبعيات؟
الإجابة:
بعد كل عرض — هذا نادراً ما يكون مطلوباً وسبب شائع للأخطاء.
لماذا نحتاج دالة التنظيف؟
الإجابة:
لتنظيف الاشتراكات أو المؤقتات عند فك تثبيت المكون لتجنب تسريب الذاكرة.
ما الفرق بين [] و [dep] في مصفوفة التبعيات؟
الإجابة:
فارغة [] = مرة واحدة فقط. [dep] = عند تغيير dep.
اجمع التبعيات دائماً
نسيان تبعية يسبب أخطاء صعبة الاكتشاف. استخدم ESLint plugin.
لا تجعل async useEffect
استخدم دالة async منفصلة داخل useEffect بدلاً من جعل التأثير async مباشرة