React의 모든 컴포넌트에는 LifeCycle(수명 주기)가 존재한다. LifeCycle 메서드는 클래스형 컴포넌트에서만 사용가능하며, 함수형 컴포넌트에서는 사용할 수 없다. 대신 Hooks를 사용하여 비슷한 작업을 처리할 수 있다.
LifeCycle은 크게 3가지의 카테고리로 나눌 수 있다.
DOM이 생성되고 브라우저에 나타날 때
constructor()
constructor(props) {
super(props);
this.state = { counter: 0 };
}
getDerivedStateFromProps()
static getDerivedStateFromProps(nextProps, prevState) {
if (nextProps.color !== prevState.color) {
return { color: nextProps.color };
}
return null;
}
render()
componentDidMount()
에서 처리해야 한다.componentDidMount()
컴포넌트에서는 다음과 같은 4가지의 경우에 업데이트가 있어난다.
1. props가 바뀔 때
2. state가 바뀔 때
3. 부모 컴포넌트가 re-rendering 될 때
4. this.forceUpdate()
로 강제 렌더링을 할 때
부모 컴포넌트가 re-rendering 되면 props와 state가 바뀌지 않아도 자식 컴포넌트는 re-rendering 된다.
이 4가지 경우로 인해 컴포넌트에서 업데이트가 일어나면 다음 메서드가 호출된다.
getDerivedStateFromProps()
shouldComponentUpdate()
this.forceUpdate()
를 호출한다면 이 단계는 생략되고 바로 render()
함수가 호출된다.this.props
, this.state
로 현재 props와 state에 접근할 수 있고, nextProps
, nextState
로 새로 설정될 props와 state에 접근할 수 있다.render()
getSnapshotBeforeUpdate()
componentDidUpdate()
componentDidUpdate(prevProps, prevState, snapshot)
getSnapshotBeforeUpdate()
에서 반환한 값이 있으면 snapshot 값을 전달 받을 수 있다.컴포넌트를 DOM에서 제거하는 단계
componentWillUnmount()
componentDidMount()
에서 등록한 이벤트, 타이머, 직접 생성한 DOM이 있으면 이 메서드에서 제거 해야한다.componentDidCatch()
componentDidCatch(error, info) {
console.log('에러!');
this.setState({
error: true
});
}