useEffect와 함수형 컴포넌트 생명주기useEffect의 첫 번째 전달인자로 들어가는 함수를 effect function이라고 한다. 이 함수가 실행되는 시점은 두 번째 전달인자(의존성 배열)에 따라 달라진다.
// 1. 모든 렌더링마다 실행 (마운트 + 모든 업데이트)
useEffect(
() => console.log("---- effect function called")
)
// 2. 마운트 시에만 실행
useEffect(
() => console.log("---- effect function called"),
[]
)
// 3. 마운트 + 의존성 변경 시 실행
useEffect(
() => console.log("---- effect function called");,
[apple, banana]
)
useEffect가 반환하는 함수를 cleanup function이라고 한다. 이는 effect function이 만든 부작용(부수적 효과, side-effect)를 정리하는 데에 사용된다.
실행 시점
// 업데이트, 리렌더 -> 함수 호출, 새 component 생성 -> 새 effect function 호출 직전에 이전 effect function의 cleanup function 호출됨
useEffect(
() => {
console.log("---- effect function called")
const timer = setTimeout(() => console.log("---- waited for 10 sec"), 10000)
return () => {
clearTimeout(timer) // 직접 side effect 정리해야 함
console.log("---- cleaned up timeout")
}
}
)
state이 바뀌면 컴포넌트 리렌더가 일어난다. 무조건
리렌더는 업데이트이기 때문에 useEffect, useMemo를 통해 함수 재호출을 피할 수 있다.
다면 useCallback은 함수의 재정의를 막는 것이지, 컴포넌트에서 호출이 되고 있다면 그건 리렌더가 일어날 때마다 또 다시 일어난다.
update: state이 바뀐다, parameter가 바뀐다
mount: 최초 로딩에만