آرمین
6 ماه پیش توسط آرمین مطرح شد
1 پاسخ

جایگزین شدن useEffect با function در بیشتر موارد

سلام
با توجه به اینکه در بیشتر موارد state درحال تغییر هست مانند فیلتر محصولات به محض کلیک شدن button و محاسبه مجموع سبد خرید و ...
و حتی یک counter ساده ، در اکثر موارد من به جای فانکشن معمولی میام از useEffect استفاده میکنم طوری که در یک کامپوننت ممکنه چندین useEffect داشته باشم اما فانکشن معمولی خیر.
میخوام بدونم این مدل کدنویسی درست هست یا نه؟
تشکر


ثبت پرسش جدید
رضا پارسیان
تخصص : توسعه دهنده Php , Laravel
@Rp76 1 هفته پیش مطرح شد
0

سلام
کاش یه نمونه گذاشته بودید

خب مشکلاتی که پیش میاد بیشتر به این شکل هست که باعث re-render بیش از حد میشه و خوانایی کد رو به شدت پایین میاره!

۱- رندر اضافی و غیرضروری:
وقتی یک state تغییر می‌کند، کامپوننت رندر می‌شود. اگر شما در useEffect یک state دیگر را بروزرسانی کنید (مثلاً مجموع سبد خرید را در useEffect محاسبه و در یک state ذخیره کنید)، باعث یک رندر اضافی می‌شوید. اما اگر مقدار را مستقیماً در حین رندر محاسبه کنید، همان یک رندر کافی است.
۲- پیچیدگی و خوانایی کمتر:
وجود چندین useEffect با وابستگی‌های مختلف، درک جریان داده را سخت می‌کند. در حالی که یک تابع ساده که در بدنه کامپوننت تعریف شده و مقدار را برمی‌گرداند، بسیار خواناتر است.

۳- احتمال خطا در وابستگی‌ها:
فراموش کردن وابستگی صحیح در useEffect می‌تواند باعث رفتارهای عجیب و باگ‌های سخت شود.

function Cart() {
  const [items, setItems] = useState([]);
  const [total, setTotal] = useState(0);

  useEffect(() => {
    const sum = items.reduce((acc, item) => acc + item.price, 0);
    setTotal(sum);
  }, [items]);

  return <div>Total: {total}</div>;
}

خب این کد ۲بار رندر میشه در صورتی که نیاز نیست

اگر شما فانکشن یا متغیر عادی تعریف کنید، منظور از عادی همچین چیزی هست:

const a=10;
let b=12;

function name(){
return "reza"
}

const surname=()=> {
return "parsian"
}

این ها هم با هربار رندر شدن refrence هاشون عوض میشه و متغیر های قبلی نیستند!
بهتره که بیرون از بدنه کامپوننت ساخته بشن یا از

  1. useState
  2. useMemo
  3. useCallback
  4. useRef
    استفاده بشه!

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام