결과적으로, 컴포넌트가 언마운트된 이후에는 오래된 네트워크 요청 처리에는 더 이상 상태 업데이트가 발생하지 않으므로 안전하게 비동기 작업을 처리할 수 있습니다.
커스텀 Hook
이제 위에서 작업한 예시를 (비동기 네트워크 요청)을 커스텀 Hook으로 만들어서 사용해보도록 하겠습니다.
커스텀 Hook을 추출하는 것은 데이터의 흐름을 명확하게 해줍니다. url을 입력하고 data를 받습니다. useData안의 Effect를 “숨김으로써” 다른 사람이 ShippingForm(부모) 컴포넌트에 불필요한 의존성을 추가하는 것을 막을 수 있습니다. 시간이 지나면 앱의 대부분 Effect들은 커스텀 Hook 안에 있을 겁니다.
import { useState, useEffect } from'react';
exportfunctionuseData(url) {
const [data, setData] = useState(null);
const [error, setError] = useState(null); // 에러 상태 추가useEffect(() => {
if (!url) return;
let ignore = false;
// 비동기 작업을 수행하는 내부 함수const fetchData = async () => {
try {
const response = awaitfetch(url);
if (!response.ok) {
thrownewError('Network response was not ok');
}
const json = await response.json();
if (!ignore) {
setData(json);
}
} catch (err) {
if (!ignore) {
setError(err.message);
}
}
};
fetchData();
return() => {
ignore = true;
};
}, [url]);
return { data, error }; // 에러와 데이터를 모두 반환
}