티스토리 뷰

개발/React

React 생명주기

네스사 2023. 4. 5. 21:19

React 생명주기란?


  • 리액트의 컴포넌트에는 라이프사이클(수명 주기)이 존재하며, 컴포넌트의 수명은 페이지에 렌더링되기 이전인 준비과정에서 시작하여 페이지에서사라질 때 끝난다.
  • 컴포넌트를 처음으로 렌더링 할 때, 어떤 작업을 처리해야하거나, 컴포넌트를 업데이트하기 전후로 어떤 작업을 처리해야 할 수도 있고, 불필요한 업데이트를 방지해야 할 때 컴포넌트의 라이프사이클 메서드를 사용한다.
  • 이 라이프사이클 메서드는 클래스 컴포넌트에서 사용할 수 있으며, Hooks을 통해서도 사용가능하다.

 

 

라이프사이클 메서드 


  • 라이프사이클 메서드 종류는 총 9가지이며,  Mount, Update, Unmount의 3 종류의 카테고리로 나눌 수 있다.
  • 또한 각 메서드에 will 접두사가 붙으면 어떤 작업을 작동하기 전에 실행, Did 접두사가 붙으면 어떤 작업을 작동한 후에 실행하는 메서드이다.

 

 

 

Mount


 DOM 객체가 생성되고 브라우저에 나타나는 것, 즉 컴포넌트 생성부터 최초 렌더링까지의 과정을 의미한다.

마운트 시 호출되는 메서드는 다음과 같다.

  • constructor : 생성자라 컴포넌트를 새로 만들 때마다 호출되는 클래스 생성사 메서드. 클래스형 컴포넌트에서는 초기 state를 정할 때 constructor를 사용해야 하며, 함수형 컴포넌트에서는 useState hook을 사용해 초기 state값 정할 수 있다.
class Example extends React.Component {
  constructor(props) {
    super(props);
      this.state = { count: 0 };
}

위의 코드는 아래와 같은 의미이다.

const Example = () => {
  const [count,setCount] = useState(0);
}

 

  • getDerivedStateFromProps : props 로 받아 온 값을 기존의 state에 동기화시키는 메서드. 컴포넌트가 Mount, Update 될 때 render 메서드가 호출되기 직전에 호출된다. state를 갱신하기 위한 객체를 반환하거나, null을 반환하여 아무것도 갱신하지 않을 수 있다. 주로 시간이 흐름에 따라 변하는 props에 state가 의존하는 아주 드문 경우를 위하여 존재합니다. 
static getDerivedStateFromProps(nextProps, prevState) {
  // 조건에 따라 특정 값 동기화
    if(nextProps.value !== prevState.value) {
     return { value: nextProps.value };
    }
    return null;  // state 변경할 필요 없을 경우 null 반환
}

 

  • render : 준비한 UI를 렌더링하며, 반드시 구현돼야하는 메서드. this.props  this.state 에 접근할 수 있으며, 리액트 요소를 반환한다. render는 컴포넌트의 state를 변경하지 않고, 호출될 때마다 동일한 결과를 반환해야 하며, 브라우저와 직접적으로 상호작용을 하지 않는 순수함수이다.

 

  • componentDidMount : 컴포넌트가 웹 브라우저상에 나타난 후 호출하는 메서드. 컴포넌트의 첫 번째 렌더링이 마치고 나면 호출된다. 다른 자바스크립트 라이브러리 또는 프레임워크의 함수를 호출,이벤트 등록, setTimeout, setInterval, 네트워크 요청 같은 비동기 작업을 처리한다. useEffect가 이 역할을 수행 할 수 있다.

만약 componentDidMount에서 상태가 변화하거나 다른 작업이 실행된다면, 실행 결과를 반영하기 위해서  getDerivedStateFromProps와 render를 다시 호출한다. 이 때, componentDidMount는 다시 호출되지 않는다.

 

Update


컴포넌트는 다음 4가지 경우에 업데이트한다.

  • props가 바뀔 때
  • state가 바뀔 때
  • 부모 컴포넌트가 리렌더링될 때
  • this.foceUpdate로 강제로 렌더링 트리거할 때

업데이트에 호출되는 메서드는 다음과 같다.render,getDerivedStateFromProps 은 위에서 설명한 것과 동일하다.

  • getDerivedStateFromProps 
  • shouldComponentUpdate : 컴포넌트가 리렌더링을 해야 할지 말아야 할지를 결정한다. props나 state를 변경했을 때 이전값과 같다면 변경하지 않는다. true 를 반환하면 다음 라이프사이클 메서드를 계속 실행, false 를 반환하면 작업을 중지한다. 일부러 반환값을 false로 고정하여 특정 상태의 값을 변경하는 것을 의도적으로 막을 수 있다. 
  • render 
  • getSnapshotBeforeUpdate : 컴포넌트 변화를 DOM에 반영하기 바로 직전에 호출. 스크롤바 위치 유지같은 업데이트하기 직전의 값을 참고할 일이 있을 때 활용한다.
getSnapshotBeforeUpdate(prevProps, prevState) {
  if(prevState.array !== this.state.array) {
    const { scrollTop, scrollHeight } = this.list;
    return { scrollTop, scrollHeight };
  }
}
  • componentDidUpdate : 컴포넌트의 업데이트 작업이 다 끝난 후 호출. 컴포넌트가 이전에 가졌던 데이터에 접근할 수 있거나, getSnapshotBeforeUpdate 에서 반환한 값이 있으면 여기서 전달받을 수 있다. useEffect에서 deps에 값이 있다면, 이 단계에서 실행된다.

 

 

Unmount


Mount 와 반대로 컴포넌트를 DOM에서 제거하는 것을 Unmount 라고 한다. 언마운트는 오직 componentWillUnmount 만을 호출한다.

  • componentWillUnmount : 컴포넌트가 웹 브라우저상에서 사라지기 전에 호출. componentDidMount 에서 등록한 이벤트, 타이머, 직접 생성한 DOM이 있다면, 여기서 제거 작업을 해야한다. useEffect에서 deps가 빈 배열이거나 공란이면 componentWillUnmount단계에서 제거작업을 수행하는 함수를 리턴할 수 있다.

'개발 > React' 카테고리의 다른 글

redux 개요  (0) 2023.04.24
useRef  (0) 2023.04.19
useEffect  (0) 2023.04.03
props & state  (0) 2023.03.27
React SPA  (0) 2023.03.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함