ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] Life Cycle
    카테고리 없음 2024. 11. 24. 23:25

    라이프 사이클 메서드의 종류는 크게 마운트, 업데이트, 언마운트 종류로 나눌 수 있습니다.

     

    1. 마운트

    마운트는 컴포넌트가 페이지에 새로 추가될 때 발생하는 단계이다. 이 단계에서는 다음과 같은 메서드가 호출된다.

    • constructor : 컴포넌트가 생성될 때 호출
    • getDerivedStateFromProps : props에 있는 값을 state에 넣을 때 사용하는 메서드이다. 컴포넌트가 생성될 때와 새로운 props를 받았을 때 호출된다.
    • render : 컴포넌트가 렌더링될 때 호출된다. 즉, 우리가 준비한 UI를 렌더링해주는 메서드이다.
    • componentDidMount : 컴포넌트가 웹 브라우저상에 나타난 후 호출하는 메서드이다.

    2. 업데이트

    컴포넌트는 다음과 같은 총 네 가지 경우에 업데이트된다.

    • props의 변경
    • state의 변경
    • 부모 컴포넌트 리렌더링
    • this.forceUpdate로 인한 강제 렌더링

    이렇게 컴포넌트를 업데이트 할 경우 다음 메서드들을 호출한다.

    • getDerivedStateFromProps : 컴포넌트가 생성될 때와 새로운 props를 받았을 때 호출된다. props의 변화에 따라 state도 변화를 주고 싶을 때 사용한다.
    • shouldComponentUpdate : 컴포넌트가 업데이트되어야 하는지 여부를 결정한다. 이 메서드는 true 혹은 false 값을 반환행야하며, true를 반환하면 라이프사이클 메서드를 계속 실행하고, false를 반환하면 작업을 중지한다. 즉, false일 경우 컴포넌트가 리렌더링 되지 않는다.
    • render : 컴포넌트가 리렌더링될 때 호출된다.
    • getSnapshotBeforeUpdate : render() 메서드 호출 직후, 실제로 DOM에 반영되기 전에 호출되는 메서드이다.
    • componentDidUpdate : 컴포넌트가 업데이트된 후 호출된다.

    3. 언마운트

    업데이트는 컴포넌트의 state나 props가 변경될 때 발생하는 단계이다. 이 단계에서는 다음과 같은 메서드가 호출된다.

    • componentWillUnmount : 컴포넌트가 웹 브라우저상에서 사라지기 전에 호출되는 메서드이다.

     

    메서드 종류

    render()
    render() 메소드는 Class Component의 필수적으로 들어가야 하는 메소드입니다.
     
    • React elements 일반적으로 JSX를 통해 생성됩니다.
     
    return (
    <div className="wrap-movie">
    <div className="movie-poster">
    <MoviePoster poster={posterUrl}/>
    </div>
    <div className="box-movie">
    <span className="movie-title">{title}</span>
    <div className="movie-genres">
    {genres.map((genre, idx) => {<MovieGenre genres={genre} index={idx}/>})}
    </div>
    <p className="movie-synopsis">
    {synopsis}
    </p>
    </div>
    </div>
    )
    • Array and Fragments Fragments를 사용하면 자식 컴포넌트들을 그룹화 할 수 있다. Fragments 를 자세히 알아 보실 수 있습니다.
    • Portals Portals 는 부모 Component의 DOM계층 외부에 존재하는 DOM 노드 자식에 렌더링하는 일급 방법을 제공한다. 자세히 알아 보고 싶다면 Portals 링크를 참조 하세요.
    • String and numbers 이들은 텍스트 노드로 DOM에 렌더링 됩니다.
    • Booleans or null 렌더링되면 안됩니다. 이 둘은 어떠한 판단이나 테스트를 위해 존재하며, 렌더링 될 요소는 아닙니다.
    추가적으로 render() 는 순수한 함수입니다. 즉, 입력이 동일하면 출력 또한 항상 동일 하여야 합니다.

     

    constructor()

    State를 초기화 하지 않고 메소드를 바인딩 하지 않는 다면 constructor()를 쓸 필요 없습니다.
    Component가 마운트 되기전에 constructor()가 먼저 호출 되며 구현 시에는 super()가 다른 구문들 맨 앞에 오게 해야 합니다.
    그 이유는 그렇지 않으면 this.props 가 정의 되지 않아 오류가 발생 할 수 있습니다.
    일반적으로 React의 constructor는 두 가지 용도로만 사용됩니다.

    • this.state Oject를 통해 local state (Component) 를 초기화 합니다.
    • 이벤트 처리기 메소드를 바인딩 합니다.
    constructor(props) {
      super(props);
      // Don't call this.setState() here!
      this.state = { counter: 0 };
      this.handleClick = this.handleClick.bind(this);
    }

     

    componentDidMount()

    Component가 마운트 된 후 즉시 호출 됩니다. 그러므로 DOM 노드에서 필요한 초기화는 이 메소드에서 진행 되어야 합니다.
    class App extends Component {
      state = {};
    
    
      /**
       * Life cycle of React
       */
      componentDidMount() {
        this._getMovies();
      }
    }

     

    componentDidUpdate()

    State가 업데이트 발생 한 직후 호출 됩니다. 초기 렌더링에서는 호출 되지 않습니다. 

     componentDidUpdate(prevProps, prevState, snapshot)
    componentDidUpdate(prevProps) {
        // Typical usage (don't forget to compare props):
        if (this.props.userID !== prevProps.userID) {
          this.fetchData(this.props.userID);
        }
    }

    위 예제처럼 조건을 걸어 두지 않으면 무한 루프에 빠질 수 있습니다. 또는 조건을 제대로 정확하게 걸어 두지 않으면 불필요한 추가 렌더링이 발생 할 수 있습니다. 물론 유저들에게는 잘 보이지 않겠지만 이건 성능상 매우 치명적일 수 있습니다.

     

    componentWillUnmount()

    마운트가 해제되거나 소멸 되기 직전에 호출 됩니다.

     componentWillUnmount()

    마운트가 된 컴포넌트에 마운트가 해제 되면서 제거 되거나 정리 되어야 하는 요소들은 이 메소드에 작성 하여 주시면 됩니다.

     

    댓글

Designed by Tistory.