useEffect
는 함수 컴포넌트 내에서 이런 side effects를 수행할 수 있게 해줍니다. React class의 componentDidMount, componentDidUpdate, componentWillUnmount와 같은 목적으로 제공되지만 하나의 API로 통합된 것입니다.
useEffect(function);
useEffect(() => {}, [count]) // 의존성 배열 (배열 안에 담긴 값들을 추적, 그때 마다 업데이트)
명령형 또는 어떤 effect를 발생하는 함수를 인자로 받습니다.
useEffect
에 전달된 함수는 화면에 렌더링이 완료된 후에 수행되게 될 것입니다.
useEffect(() => {
console.log("componentDidUpdate")
})
useEffect(() => {
console.log("componentDidMount")
return () => console.log("componentWillUnmount")
}, [])
useEffect(() => {
console.log("componentDidMount")
console.log("componentDidUpdate") // + shouldComponentUpdate
return () => console.log("???")
}, [state])
// WRONG!!
useEffect(() => {
fetch(`/users/${id}`)
}, [])
useEffect(() => {
fetch(`/users/${id}`)
}, [state])
// GOOD!!
useEffect(() => {
fetch(`/users/${id}`)
}, [state])
간편한 이해를 위해 클래스형 컴포넌트와 비교하자면 useEffect는 여러가지 라이프 사이클이 합쳐진 형태로 설명할 수 있습니다.
const Foo = () => {
const [state, setState] = useState(0);
console.log("render", state);
useEffect(() => {
console.log("useEffect Callback", state);
return () => console.log("cleanUp", state);
}, [state]);
return <div onClick={() => setState(state + 1)}>하잉</div>;
};
export default Foo;
render
render, 0
useEffect Callback, 0
cleanUp, 0
// 클릭
render, 1
useEffect Callback, 1
cleanUp, 1
render, 0
useEffect Callback, 0
// 클릭
render, 1
cleanUp, 0
useEffect Callback, 1
// class component
handleBtnColor = () => {
this.setState({
color: "red"
}, () => console.log(this.state.color))
}
// function component
const [color, setColor] = useState("blue")
const handleBtnColor = () => {
setColor("red")
}
useEffect(() => {
console.log(color)
}, [color])