[React] memory leak error (useEffect cleanup function)__Can't perform a React state update on an unmounted component.
π Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλ νμ μν μ λ°μ΄νΈλ₯Ό μλνκΈ° λλ¬Έμ λ°μνλ€.
μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλ λ μ§ν μ€μΈ λΉλκΈ° μμ μ μ·¨μνκ±°λ, μ»΄ν¬λνΈμ μνλ₯Ό μ λ°μ΄νΈνμ§μλλ‘ ν΄μΌνλ€.
→ useEffectν μμμ ν΄λ¦°μ ν¨μλ₯Ό λ°ννμ¬, μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλκΈ° μ μ νμν μ 리 μμ !
→ dataFetching μ΄ν μν μ λ°μ΄νΈλ₯Ό νκΈ° μ μ μ»΄ν¬λνΈκ° μ¬μ ν λ§μ΄νΈλ μνμΈμ§λ₯Ό νμΈνλ λ°©λ²μΌλ‘ λ¬Έμ ν΄κ²°
μ΄μ μ½λ
const MSearch = () => {
const { searchText } = useParams();
const axiosAuth = useAxiosAuth();
const [data, setData] = useState([]);
const [results, setResults] = useState([]);
const [isLoading, setIsLoading] = useState(false);
useEffect(() => {
if (searchText !== '') {
const searchRule = async () => {
setIsLoading(true);
const response = await axiosAuth({
method: 'POST',
url: '/api/~~~',
data: { searchText },
});
setData(response.data);
setResults(response.data);
setIsLoading(false);
};
searchRule();
}
}, [searchText]);
return ( ... )
}
λ³κ²½ λ μ½λ
const MSearch = () => {
const { searchText } = useParams();
const axiosAuth = useAxiosAuth();
const [data, setData] = useState([]);
const [results, setResults] = useState([]);
const [isLoading, setIsLoading] = useState(false);
useEffect(() => {
// λ§μ΄νΈ μνλ₯Ό μΆμ νλ λ³μ
let isMounted = true;
if (searchText !== '') {
const searchRule = async () => {
setIsLoading(true);
try {
const response = await axiosAuth({
method: 'POST',
url: '/api/~~~',
data: { searchText },
});
if (isMounted) { // λ§μ΄νΈλ μν -> μ
λ°μ΄νΈ
setData(response.data);
setResults(response.data);
setIsLoading(false);
}
} catch (error) {
console.error(error);
if (isMounted) { // λ§μ΄νΈλ μν -> μλ¬
setIsLoading(false);
}
}
};
searchRule();
}
// + ν΄λ¦°μ
ν¨μ,,, λ§μ΄νΈ μν false
return () => {
isMounted = false;
};
}, [searchText]);
return ( ... )
};
>>
Reactμ useEffect ν μ μ¬μ©ν λ, ν΄λ¦°μ (clean-up) ν¨μλ₯Ό μ μνμ¬ λΉλκΈ° μμ μ΄λ ꡬλ μ μ 리ν μ μλ€.
μ΄κ²μ μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλκ±°λ μ¬λλλ§λκΈ° μ μ μ€νλμ΄μΌ νλ μμ μ μννλ λ° μ¬μ©λλ€.
μΌλ°μ μΌλ‘ useEffect ν μμμ λΉλκΈ° μμ μ μνν λ, ν΄λΉ μμ μ λν μ°Έμ‘°λ₯Ό ν΄λ‘μ λ μ»΄ν¬λνΈμ μνμ μ μ₯νλ€. κ·Έλ¬λ©΄ λΉλκΈ° μμ μ΄ μλ£λ νμ μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλμλμ§ νμΈνκ³ , μΈλ§μ΄νΈλμλ€λ©΄ μμ μ μ€μ§νκ±°λ μ 리ν μ μλ€.
μλ₯Ό λ€μ΄, useEffect λ΄μμ setIntervalμ μ¬μ©νμ¬ μΌμ μκ°λ§λ€ μνλ₯Ό μ λ°μ΄νΈνλ μμ μ μνν λ, μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλλ©΄ ν΄λΉ setIntervalμ ν΄λ¦¬μ΄(clear)ν΄μΌ νλ€.
ν΄λ¦°μ ν¨μλ useEffect ν μ λ°ν κ°μΌλ‘ μ μλλ©°, useEffect λ΄μμ ν΄λ¦°μ ν¨μλ₯Ό λ°ννλ©΄ ν΄λΉ ν¨μλ μ»΄ν¬λνΈκ° λ§μ΄νΈ ν΄μ λ λ νΈμΆλλ©°, ν΄λ¦°μ ν¨μκ° νΈμΆλλ©΄ μ΄μ μ μ€μ ν λͺ¨λ μμ μ μ 리ν μ μλ€.
μλ₯Ό λ€μ΄, useEffect λ΄μμ ꡬλ μ μ€μ ν κ²½μ°, ν΄λ¦°μ ν¨μμμ ν΄λΉ ꡬλ μ ν΄μ§ν μ μλ€. μ΄κ²μ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νκ³ , μ»΄ν¬λνΈκ° λ§μ΄νΈ ν΄μ λ λ λΆνμν μμ μ΄λ ꡬλ μ΄ λ¨μ§ μλλ‘ νλ€.
μ 리 > useEffect λ΄μμ setIntervalμ μ¬μ©νμ¬ μΌμ μκ°λ§λ€ μνλ₯Ό μ λ°μ΄νΈνλ μμ μ μνν λ,
μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλλ©΄ ν΄λΉ setIntervalμ ν΄λ¦¬μ΄ ν΄μΌνλ κ²κ³Ό κ°μ λ§₯λ½μ΄λ€.