API 있으니까 dummy data 변경해주자
import { useState } from 'react';
import { Link } from "react-router-dom";
export default function DayList() {
const [days, setDays] = useState([]);
return (
<ul className="list_day">
{days.map(day => (
<li key={day.id}>
<Link to={`/day/${day.day}`}>Day {day.day}</Link>
</li>
))}
</ul>
);
}
dummy데이터 임포트하는거 삭제
days state 만들고 → 처음에는 빈배열로 만들어주고, API에서 list 가져와서 바꿔주는 방식으로 구현예정
어떤 상태값이 바뀌었을때 동작하는 함수 작성할 수 있음
함수가 호출되는 타이밍
→ 렌더링 결과가 돔에 반영된 직후
→ 컴포넌트가 사라지기 직전에도 마지막으로 호출됨.
import { useEffect, useState } from 'react';
import { Link } from "react-router-dom";
export default function DayList() {
const [days, setDays] = useState([]);
const [count, setCount] = useState(0);
function onClick() {
setCount(count + 1);
};
useEffect(() => {
console.log("Count Change");
});
return (
<>
<ul className="list_day">
{days.map(day => (
<li key={day.id}>
<Link to={`/day/${day.day}`}>Day {day.day}</Link>
</li>
))}
</ul>
<button onClick={onClick}>{count}</button>
</>
);
}
버튼 클릭할때마다 count값이 증가하며 Count Change 출력함
useEffect는 상태값이 변경되면 다시 렌더링해서 호출됨
만약 렌더링 끝난 후 어떤 작업을 하고 싶다면(ex. API 호출) useEffect 첫번째 매개변수로 함수 전달해주자
→ but 이렇게 하면 매번 변경 일어날 때마다 불필요하게 함수 호출할 수 있음(원하지 않는 상황에 호출된다던가?)
Day change 버튼 만들어서 기존 배열에 day를 하나씩 추가해준다.(Day는 1로 고정)
버튼을 누르면 위 사진처럼 Day1이 계속 추가됨, 그런데, Count change가 계속 출력되고 있다(count 값 변하지 않았는데) → 불필요한 실행을 하고 있다는 것!
→ 해결필요,,
useEffect(() => {
console.log("Count Change");
}, [count]);
우리가 여기서 useEffect를 사용하는 목적은 API 호출하는것 → 렌더링 완료 후 최초로 API 호출 한번만 해주면 된다! → 의존성 배열에 빈 배열 입력
useEffect(() => {
console.log("Count Change");
}, []);
⭐️ 상태값과 무관하게 렌더링 직후 한번만 실행되는 작업은 빈 배열만 전달하면 됨
useEffect(() => {
fetch('http://localhost:3001/days')
.then(res => {
return res.json()
})
.then(data => {
setDays(data);
})
}, []);
→ 이제 dummy로 사용했던 부분 교체해주면 됨.
useEffect(() => {
fetch(`http://localhost:3001/words?day=${day}`)
.then(res => {
return res.json();
})
.then(data => {
setWords(data);
});
}, [day]);
day가 변경되면 변경된 단어 불러오도록 함.
→ 각 코드의 useEffect의 로직이 동일함.
→ 개발자가 커스텀 훅 작성할수도 있다!