컴포넌트를 만들다 보면 반복되는 로직이 자주 발생된다. 따라서 custom hooks를 만들어서 반복되는 로직을 쉽게 재활용 할 수 있다.
Custom Hooks는 "use"라는 단어로 시작한다. (ex: useFetch)
기존에 사용했던 fetch는 아래처럼 모든 component에 사용해야했다.
const [sources, setSources] = useState([]);
useEffect(() => {
fetch('data/movieCarouselData.json', {
method: 'GET',
})
.then(res => res.json())
.then(data => {
setSources(data);
});
}, []);
하지만 custom hooks를 사용하면 모든 component에 재사용이 가능하다.
src 디렉터리에 hooks라는 디렉터리를 만들고 useFetch.js 파일을 생성한다.
아래의 코드를 넣어준다.
useFetch.js
import { useState, useEffect } from 'react';
const useFetch = url => {
const [data, setData] = useState(null);
useEffect(() => {
fetch(url)
.then(res => res.json())
.then(data => setData(data))
}, [url]);
return [data];
};
export default useFetch;
...
import useFetch from '../../../hooks/useFetch';
...
const [sources] = useFetch('data/movieCarouselData.json');
...
return (
...
{sources &&
sources.map((source, index) => (
<div key={index}>
<MovieCarousel source={source} />
</div>
))}
...
);
};
...
여기서 sources
는 useFetch
에서 사용되었던 data
변수이며 useFetch 가로안에 있는 url
을 입력해주면 된다.
return안에서 기존에는 sources.map
만 넣었으면 되나 custom hooks를 사용하면 sources && sources.map
으로 진행해야 한다.
해당 useFetch는 단일 데이터를 받아올 때 사용이 가능하며 추후 axios를 적용해야 error도 잡아 낼 수 있는 방법이 있다고 한다.
참고 및 출처
https://towardsdev.com/react-custom-hook-fetch-cf764f717b88
https://react.vlpt.us/basic/21-custom-hook.html
https://www.w3schools.com/react/react_customhooks.asp