useEffect 후크에서 API 요청을 처리하는 올바른 방법
const [data, setData] = useState([]);
useEffect(() => {
axios.get('get/some/data').then(({ data }) => {
setData(data);
});
}, []);
요청이 완료되기 전에 구성 요소가 마운트 해제되는 상황이 발생하는 것도 일반적입니다. 요청이 취소되지 않았기 때문에 구성 요소가 마운트 해제되더라도 콜백은 계속 실행됩니다. 결과적으로
setData
가 호출되면 브라우저 콘솔에 다음과 같은 흥미로운 경고가 표시됩니다.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
정리 기능에서). 이는 다음과 같이 axios
를 사용하여 쉽게 달성할 수 있습니다.const [data, setData] = useState([]);
useEffect(() => {
const cancelToken = axios.CancelToken.source();
axios
.get('get/some/data', { cancelToken: cancelToken.token })
.then(({ data }) => {
setData(data);
})
.catch((err) => {
if (axios.isCancel(err)) {
// TODO
}
});
return () => {
cancelToken.cancel();
};
}, []);
이는 다음과 같이
fetch
를 사용하여 AbortController
로 수행할 수도 있습니다.const [data, setData] = useState([]);
useEffect(() => {
const controller = new AbortController();
fetch('get/some/data', { signal: controller.signal })
.then((res) => res.json())
.then((data) => {
setData(data);
})
.catch((err) => {
if (err.name === 'AbortError') {
// TODO
}
});
return () => {
controller.abort();
};
}, []);
Reference
이 문제에 관하여(useEffect 후크에서 API 요청을 처리하는 올바른 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/elishaking/correct-way-to-handle-api-requests-in-a-useeffect-hook-13bf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)