src폴더 아래에 hooks 폴더 생성, useFetch.js파일 생성(우리가 만들 커스텀 훅)
import { useEffect, useState } from 'react';
export default function useFetch(url) {
const [data, setData] = useState();
useEffect(() => {
fetch(url)
.then(res => {
return res.json();
})
.then(data => {
setData(data);
});
}, [url]);
return data;
}
const days = useFetch("http://localhost:3001/days");
const words = useFetch(`http://localhost:3001/words?day=${day}`)
이전 코드에서 useEffect 썼던 부분 다 지워주고 새로 만든 훅으로 코드 수정!
TypeError: Cannot read property 'map' of undefined
출처: https://devbirdfeet.tistory.com/47
리액트는 렌더링이 화면에 커밋된 후에야 모든 효과를 실행한다.
즉 return words.map(…) 반복실행시 첫 턴에 데이터 안들어와도 렌더링 실행되며, 당연히 그 데이터는 undefinded로 정의되어 오류 발생
return (
<ul className="list_day">
{days && days.map(day => (
<li key={day.id}>
<Link to={`/day/${day.day}`}>Day {day.day}</Link>
</li>
))}
</ul>
);
비슷한 작업은 커스텀 훅으로 작업하면 코드가 훨씬 간결해진다!