Effect Hook
- react class의 componentDidMount, componentDidUpdate, componentWillUnmount와 같음
- 하나의 API로 통합
useEffect
useEffect(function);
useEffect(() => {}, [count]) // 의존성 배열 (배열 안에 담긴 값들을 추적, 그때 마다 업데이트)
- 명령형 또는 어떤 effect를 발생하는 함수를 인자로 받는다
- useEffect에 전달된 함수는 화면에 렌더링이 완료된 후에 수행된다
- 뒤에 (,[])빈 배열을 전달하면 return전까지만 실행된다.
즉 컨디마와 같다(첫실행 한번만 실행 됨)
- unMount때는 return 함수가 실행 됨
사용법
import { useEffect } from "react"
useEffect( 실행시킬 동작, [ 타이밍 ] )
document.addEventListener("타이밍", 실행시킬 동작)
useEffect(() => {
})
useEffect(() => {
}, [value])
useEffect(() => {
}, [])
useEffect(() => {
console.log("componentDidMount + componentDidUpdate")
})
useEffect(() => {
console.log("componentDidMount")
return () => console.log("componentWillUnmount")
}, [])
useEffect(() => {
console.log("componentDidMount")
console.log("componentDidUpdate")
return () => console.log("???")
}, [state])
useEffect(() => {
console.log("count change", count);
}, [count]);
useEffect(() => {
fetch(`/users/${id}`)
}, [])
useEffect(() => {
fetch(`/users/${id}`)
}, [id])
useEffect(() => {
fetch(`/users/${id}`)
}, [id])
순서
- 컴포넌트가 렌더링 됩니다. 최초로 진행되는 렌더링은 브라우저에 처음으로 이 컴포넌트가 보여졌다는 의미로
mount
라고 표현합니다.
- useEffect 첫 번째 인자로 넘겨준 함수(callback)가 실행됩니다(Side Effect).
- 다시 렌더링(
re-render
)이 일어납니다 (state
나 props
가 변경된 경우)
- useEffect는 두 번째 인자에 들어있는
의존성 배열
을 체크합니다.
- 만약 두 번째 인자에
아무런 값도 넘기지 않았거나
/ 인자로 넘긴 배열에 들어있는 값 중 업데이트된 것이 하나라도 있다면
첫 번째 인자로 넘겨준 함수(callback)가 실행됩니다(Side Effect).
- 하나도 없거나 빈 배열이라면, 아무런 일도 하지 않습니다.
- 만약 앞에서 일으킨 Effect에서 state나 props를 변경시켰다면 다시 렌더링이 일어납니다.
- (중략...)
- 컴포넌트가 필요 없어지면 화면에서 사라집니다. 컴포넌트가 브라우저의 화면에서 사라졌다는 의미로
unmount
라고 표현합니다.
clean up
- useEffect에 대한 뒷정리를 해준다, 컴포넌트가 사라질때 cleanup 함수가 호출된다.
- useState로 한박자 늦춰질때 사용함
- 실행될때 초기화를 한 후, 다시 실행될때 리턴된 함수를 호출함
useEffect(function(){
실행문
return function(){
실행문
}
});
const App = () => {
const [count, setCount] = useState(0);
console.log("render", count);
useEffect(() => {
console.log("useEffect Callback", count);
return () => {
console.log("cleanUp", count);
});
}, [count]);
return <div onClick={() => setCount(count + 1)}>하잉</div>;
};
export default Foo;
render, 0
useEffect Callback, 0
render, 1
cleanUp, 0
useEffect Callback, 1