پرسش

چرا در ReactJS هوک useEffect درون حلقه بی‌نهایت میوفته؟

Infinite loop in useEffect

من دارم از useEffect در پروژه ری‌اکت خودم استفاده می‌کنم، اما وقتی کدم رو اجرا می‌کنم، به نظر میاد که useEffect توی یه حلقه بی‌نهایت گیر می‌کنه. من یه آرایه وابستگی بهش دادم که فکر می‌کردم از این مشکل جلوگیری می‌کنه، اما باز هم این اتفاق می‌افته. دلیل این مشکل چیه و چطور می‌تونم جلوی این حلقه بی‌نهایت رو بگیرم؟

1403/05/31
پاسخ
محمدامین سعیدی راد
بیوگرافی محمدامین سعیدی راد

مشکل اصلی اینه که وقتی داخل useEffect یه متغیر یا تابعی رو تغییر می‌دی که خودش توی آرایه وابستگی‌ها هست، باعث میشه useEffect دوباره و دوباره اجرا بشه. این باعث میشه که حلقه بی‌نهایت به وجود بیاد.

بیایم با یه مثال ساده توضیح بدم:

import { useState, useEffect } from 'react';
function MyComponent() {
  const [count, setCount] = useState(0);
  useEffect(() => {
  // Changes with count !
  setCount(count + 1);
}, [count]); // Dependency:`count`
  return <div>{count}</div>;
}

در این مثال، هر بار که useEffect اجرا میشه، مقدار count رو با setCount افزایش میده، و چون count توی آرایه وابستگی‌ها هست، دوباره useEffect اجرا میشه و این روند بی‌نهایت ادامه پیدا می‌کنه.

برای حل این مشکل، باید مطمئن بشی که کدی که داخل useEffect هست، به شکلی نوشته شده که باعث تغییر مستقیم وابستگی‌ها نشه. یکی از راه‌حل‌ها اینه که وابستگی‌هایی که ممکنه به شکل ناخواسته تغییر کنن رو از آرایه وابستگی‌ها حذف کنی یا تغییرات لازم رو به گونه‌ای مدیریت کنی که باعث تکرار بی‌نهایت نشه. مثلاً می‌تونی از متغیرهای محلی یا توابع memoized استفاده کنی تا این مشکل برطرف بشه.

مثلاً این نسخه از کد رو ببین که مشکل رو حل می‌کنه:

import { useState, useEffect } from 'react';
function MyComponent() {
  const [count, setCount] = useState(0);
  useEffect(() => {
  const increment = () => setCount(prevCount => prevCount + 1);
  }, []); // With Empty Dependencies.
  return <div>{count}</div>;
}

توی این کد، به جای اینکه count به عنوان وابستگی توی useEffect باشه، از یه تابع increment استفاده کردیم که به مقدار count وابسته نیست.

پاسخ: 1403/05/31
آخرین آپدیت: 1403/07/21