state를 사용하면 한 번 state가 바뀔 때마다 해당 컴포넌트 전체가 다 리렌더링 되면서 코드가 실행되었다.
function App() {
const [counter, setValue] = useState(0);
const onClick = () => setValue((preb) => preb + 1)
console.log("rendered")
return (
<div>
<h1>{counter}</h1>
<button onClick={onClick}>Click me</button>
</div>
);
}
결과 -> button 클릭했을때마다
rendered
rendered
rendered
...
만약 컴포넌트가 맨 처음 render 될 때만 코드가 실행되고 싶은 경우라면?
useEffect
API를 불러오거나 다른 중요한 일을 할 때에는 굳이 또 불러올 필요가 없으므로!
useEffect 함수를 이용한다.
src/App.js
function App() {
const [counter, setValue] = useState(0);
const onClick = () => setValue((preb) => preb + 1);
console.log("i run all the time");
const iRunOnlyOnce = () => {
console.log("i run only once");
};
useEffect(iRunOnlyOnce, []); // useEffect
return (
<div>
<h1>{counter}</h1>
<button onClick={onClick}>Click me</button>
</div>
);
}
결과
i run all the time
i run only once
i run all the time
i run all the time
여러 state가 한 컴포넌트 안에 있을 때, 한 state가 변화한다고 해서 다른 state까지 변화할 필요는 없다.