آموزش تابع پاکسازی cleanup در useEffect؛ حذف event listener، clearInterval و جلوگیری از memory leak هنگام unmount یا اجرای مجدد effect در React.
تابع cleanup (پاکسازی) که از useEffect return میکنید، قبل از اجرای مجدد effect یا هنگام unmount کامپوننت فراخوانی میشود. بدون cleanup، listenerها و intervalها جمع میشوند و memory leak و افت عملکرد ایجاد میکنند.
import { useEffect } from "react";
export default function Sample() {
useEffect(() => {
const clickHandler = () => {
console.log("روی پنجره کلیک شد");
};
window.addEventListener("click", clickHandler);
return () => {
window.removeEventListener("click", clickHandler);
};
}, []);
return <div>روی صفحه کلیک کنید</div>;
}بدون removeEventListener، با هر mount یک listener اضافه میشود و با هر کلیک چند بار log چاپ میشود.
import { useEffect, useState } from "react";
export default function Timer() {
const [count, setCount] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCount((prev) => prev + 1);
}, 1000);
return () => {
clearInterval(interval);
};
}, []);
return <h1>{count}</h1>;
}با clearInterval در cleanup، تایمر بعد از unmount ادامه پیدا نمیکند.
| بدون cleanup | پیامد |
|---|---|
| listener تکراری | اجرای چندباره handler |
| interval فعال | setState روی کامپوننت حذفشده |
| subscribe باز | مصرف حافظه و باگ |
تابع cleanup بخش جداییناپذیر useEffect برای منابع بیرونی است: listener، timer، WebSocket، subscription. هر چیزی setup میکنید، در return همان effect برعکس آن را انجام دهید. این عادت از memory leak جلوگیری و اپ React را پایدار نگه میدارد.