컴포넌트의 라이프 사이클
생명주기 도표 : https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/
라이프 사이클은 총 3가지 카테고리
마운트
: DOM이 생성 되고 웹 브라우저상에 나타나는 것
업데이트
: 컴포넌트의 상태가 바뀌는 경우를 의미, 총 4가지의 업데이트 상황이 있다.
언마운트
: 컴포넌트를 DOM에서 제거하는 것을 언마운트(UnMount)라고 한다. mount 카테고리 생명주기 확인
마운트
: DOM이 생성 되고 웹 브라우저상에 나타나는 것
생명주기 메소드는 클래스형 컴포넌트에서만 사용 가능
(함수형 컴포넌트는 Hooks의 기능을 활용)
constructor(props){
super(props);
console.log('constructor');
this.state = { text : '' };
}
getDerivedStateFromProps
:
(리액트 16.3 이후에 새로 만든 라이프 사이클 메소드)
static getDerivedStateFromProps(nextProps, prevState) {
console.log('getDerivedStateFromProps');
console.log(nextProps);
console.log(prevState);
// props로 전달 된 text의 값이 state의 값과 같지 않다면 => 조건에 따라 특정 값만 동기화
if(nextProps.text !== prevState.text) {
// 변경할 state 값을 반환
return { text : nextProps.text }
}
return null; //state를 변경할 필요가 없다면 null을 반환
}
render
:
주의사항
render() {
console.log('render');
return <h1>hello world, { this.state.text }</h1>;
}
componentDidMount
:
componentDidMount() {
console.log('componentDidMount');
}
state가 변경되는 상황을 만들고 업데이트 라이프 사이클 메소드를 확인해보는 테스트
업데이트
: 컴포넌트의 상태가 바뀌는 경우를 의미, 총 4가지의 업데이트 상황이 있다.
getDerivedStateFromProps
:
(리액트 16.3 이후에 새로 만든 라이프 사이클 메소드)
static getDerivedStateFromProps(nextProps, prevState) {
console.log('getDerivedStateFromProps');
console.log(nextProps);
console.log(prevState);
return null;
}
shouldComponentUpdate
:
자주 사용되지 않는 생명주기 메소드.
주로 성능 최적화를 목적, 상황에 따라 리랜더링을 방지하기 위해 사용
반드시 boolean을 반환해야하며 false를 반환할 시 업데이트 과정을 여기에서 중단된다.
해당 메소드를 정의하지 않거나 리턴 타입을 생성하지 않으면 언제나 true 값을 반환한다.
shouldComponentUpdate(nextProps, nextState) {
console.log('shouldComponentUpdate');
console.log(nextProps);
console.log(nextState);
return true;
}
render
: 컴포넌트를 랜더링하는 메소드render(){
console.log('render');
return (
<>
<button
onClick={ () => this.setState({ now : new Date().toLocaleTimeString() }) }
>
현재 시간 확인하기
</button>
<h1>{ this.state.now }</h1>
</>
)
}
getSnapshotBeforeUpdate
:
(리액트 16.3이후 만들어진 메소드)
getSnapshotBeforeUpdate(prevProps, prevState){
console.log('getSnapshotBeforeUpdate');
/* componentDidUpdate의 snapshot으로 전달되는 확인용 */
return {
message : '스냅샷입니다.'
}
}
ComponentDidUpdate
:
ComponentDidUpdate(prevProps, prevState, snapshot){
console.log('ComponentDidUpdate');
console.log(snapshot);
}
언마운트 카테고리의 생명주기 메소드 확인하기
언마운트
: 컴포넌트를 DOM에서 제거하는 것을 언마운트(UnMount)라고 한다.
ComponentWillUnmount
:
1. 컴포넌트가 웹 브라우저 상에서 사라지기 직전에 호출되는 메소드
등록한 이벤트, 타이머, 직접 생성한 DOM이 있다면 여기에서 제거 작업을 주로 수행한다.
class Greeting extends React.Component {
render() {
console.log('render');
return <h1>hello, world!</h1>;
}
ComponentWillUnmount(){
console.log('ComponentWillUnmount');
}
}
// 랜더링 구문 분리
const ReactClientDOM = ReactDOM.createRoot(document.getElementById('root'));
ReactClientDOM.render(<Greeting/>);
/* 5초 뒤 아무런 컴포넌트로 랜더링하지 않는 것으로 변경하여 확인 */
setTimeout(() => {ReactClientDOM.render(null)}, 5000);