All Articles

react - lifecycle

1. 라이프 싸이클 메서드

라이프 싸이클 메서드는 클래스형 컴포넌트에만 사용할 수 있는데, 이게 바로 클래스형 컴포넌트를 사용하는 이유로 생각된다.

2. getDerivedStateFromProps

props로 받아온 값을 state에 동기화 시킬때 사용

3. componentDidMount

첫 렌더링 마친 후 실행

4. shouldComponentUpdate 메서드

props 또는 state를 변경했을 때, 리렌더링 여부 지정하는 메서드이며 프로젝트 성능 최적화할 때 사용

5. getSnapshotBeforeUpdate

render에서 만들어진 결과물이 브라우저에 실제로 반영되기 직전에 호출

6. componentDidUpdate

리렌더링 완료한 후 실행되는 메서드 함수내부에서 prevProps/prevState로 상태 확인 가능 getSnapshotBeforeUpdate 함수 다음 호출되므로 이 함수로 부터 return 값 전달 받을 수 있음

7. componentWillUnmount

컴포넌트를 DOM에서 제거할 때 실행, componentDisMount에서 등록한 이벤트, 타이머, 직접 생성한 DOM을 제거 해줘야함

8. componentDisCatch 메서드

컴포넌트 렌더링 도중에 에러가 발생했을 때 애플리케이션이 먹통이 되지 않고 오류 UI를 보여줄 떄 사용

import React, { Component } from 'react';

class LifeCycleSample extends Component {

    state = {
        number: 0,
        color: null
    }

    myRef = null;

    constructor(props){
        super(props);
        console.log('constructor');
    }

    static getDerivedStateFromProps(nextProps, prevState){
        console.log('getDerivedStateFromProps');

        if(nextProps.color !== prevState.color){
            return { color: nextProps.color };
        }
        return null;
    }

    componentDidMount(){
        console.log('componentDidMount');
    }

    shouldComponentUpdate(nextProps, nextState)
    {
        console.log('should component update', nextProps, nextState);

        return nextState.number % 10 !== 4;

    }

    componentWillUnmount(){
        console.log('componentWillUnmount');
    }

    handleClick = () => {
        this.setState
        (
            {
                number: this.state.number + 1

            }

        );

    }

    getSnapshotBeforeUpdate(prevProps, prevState)
    {
        console.log('getSnapshotBeforeUpdate');
        
        if( prevProps.color !== this.props.color)
        {
            return this.myRef.style.color;
        }
        return null;
    }

    componentDisUpdate(prevProps, prevState, snapshot)
    {

        console.log('componentDidUpdate', prevProps, prevState);

        if(snapshot)
        {
            console.log('color right before: ', snapshot);
        }

    }

    render() {
        const style = {
            color: this.props.color
        };

        return (
            <div>
                <h1 style={style} ref={ref => this.myRef=ref}>
                    {this.state.number}
                </h1>
                <p>color: {this.state.color} </p>

                <button onClick={this.handleClick}>더하기</button>

            </div>
        );
    }
}

export default LifeCycleSample;

참고

리액트를 다루는 기술, 김민준(VELOPERT)저