- 생명주기 메서드란 컴포넌트가 화면에서 나타낼부터 없어질 때까지의 생명주기를 표현한 메서드들이다.
- 클래스 컴포넌트에서만 사용할 수 있으며 함수형 컴포넌트에서는 이와 비슷하게 구현할 수 있는 useEffect라는 Hook이 존재한다.
컴포넌트가 마운트(처음 렌더링될 때)될 때, 업데이트될 때(props 및 state 등이 바뀌는 경우) 등의 주기에서 어떠한 동작을 할 수 있도록 해준다.
즉, 특정 시점에 해당 메서드를 사용하여 원하는 기능을 구현할 수 있다.
컴포넌트가 업데이트 될 경우
- props 값이 변경될 때
- state 값이 변경될 때
- 부모 컴포넌트가 리렌더링될 때
라이프 사이클 메서드는 클래스 컴포넌트에서만 구현되어있다.
각 메서드들은 다음과 같다.
constructor(props)
static getDerivedStateFromProps(props, state)
props 값을 state에 쓰고 싶을 때 사용한다.
(이러한 경우는 잘 없다.)
getDerivedStateFromProps는 최초 마운트 시와 갱신 시 모두에서 render 메서드를 호출하기 직전에 호출된다.
props값을 state에 쓰는 이유는 뭘까?
성능을 개선시키기위해서 쓰려한다.
state를 setState()로 업데이트하면 리렌더링이 된다.
(state가 변경되면 리렌더링됨.)
때문에 props로 초기 state 값을 넣주고 props값에 따른 state변경에 의존하여 성능을 개선시키기위해 사용한다.하지만 이는 memoization으로 해결할 수 있다.
render()
브라우저와 상호 작용이 필요한 작업은 ComponentDidMount나 다른 생명주기 메서드에서 구현해야한다.
리액트 요소들이 렌더링된 이후에 요소들이 완성되기 때문에 이후의 작업에서 요소들을 건드리는 작업을 해야한다.
componentDidMount()
static getDerivedStateFromProps(props, state)
shouldComponentUpdate(nextProps, nextState)
render()
브라우저와 상호 작용이 필요한 작업은 ComponentDidMount나 다른 생명주기 메서드에서 구현해야한다.
리액트 요소들이 렌더링된 이후에 요소들이 완성되기 때문에 이후의 작업에서 요소들을 건드리는 작업을 해야한다.
getSnapshotBeforeUpdate(prevProps, prevState)
componentDidUpdate(prevProps, prevState, snapshot)
componentWillUnmount()
컴포넌트가 마운트 해제되어 제거되기 직전에 호출된다.
이 메서드 내에서 타이머 제거, 네트워크 요청 취소, componentDidMount() 내에서 생성된 데이터 불러오기 해제 등 필요한 모든 정리 작업을 수행한다.
이제 컴포넌트는 다시 렌더링되지 않으므로, componentWillUnmount() 내에서 setState()를 호출하면 안된다.
함수형 컴포넌트에서는 라이프 사이클 메서드는 따로 없다.
하지만 useEffect라는 훅을 통하여 컴포넌트의 생명 주기별 동작을 관리할 수 있다.
이해하기 쉽도록 클래스 컴포넌트의 생명주기 메서드에 빗대어 설명해보겠다.
useEffect는 사용함에 따라componentDidMount,componentDidUpdate,componentWillUnmount로 구분하여 컴포넌트 주기별 로직을 구현할 수 있다.
다음과 같이 코드를 작성하면 컴포넌트가 마운트될 때 즉, 컴포넌트가 나타났을 때 구현할 로직을 작성할 수 있습니다.
useEffect(() => {
// 컴포넌트가 마운트될 때 실행되는 코드
}, []);
useEffect에 두 번째 인수로 빈 배열([])을 전달하면, 해당 효과는 컴포넌트가 마운트될 때 한 번만 실행됩니다.
다음과 같이 코드를 작성하면 컴포넌트가 업데이트될 때 구현할 로직을 작성할 수 있습니다.
useEffect(() => {
// 컴포넌트가 업데이트될 때 실행되는 코드
});
useEffect에 두 번째 인수를 전달하지 않으면, 해당 효과는 컴포넌트가 업데이트될 때마다 실행됩니다.
다음과 같이 코드를 작성하면 컴포넌트가 없어질 때 구현할 로직을 작성할 수 있습니다.
useEffect(() => {
return () => {
// 컴포넌트가 언마운트될 때 실행되는 코드
}
}, []);
useEffect 내부에서 함수를 반환하면, 해당 함수는 컴포넌트가 언마운트될 때 실행됩니다.
shouldComponentUpdate 메서드는 컴포넌트가 업데이트될 때, 리렌더링이 필요한지를 결정하는 메서드입니다.
useEffect의 두번째 인자인 디펜던시 배열에 값을 할당해줌으로써 shouldComponentUpdate 메서드처럼 구현할 수 있습니다.
function MyComponent(){
let changeValue = ''
useEffect(() => {
}, [changeValue]);
}
export default MyComponent
두번째 인자인 디펜던시 배열에 값인 changeValue가 변경될 때마다 MyComponent는 리렌더링된다.