-
[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()
마운트가 된 컴포넌트에 마운트가 해제 되면서 제거 되거나 정리 되어야 하는 요소들은 이 메소드에 작성 하여 주시면 됩니다.