김 양의 멋따라 개발따기
React - 라이프사이클 메서드의 이해 본문
1. 마운트(Mount)
- DOM이 생성되고 웹 브라우저상에 나타나는 것
- 호출하는 메서드
- 컴포넌트 생성
- constructor
컴포넌트를 새로 만들 때마다 호출되는 클래스 생성자 메서드 - getDerivedStateFromProps
props에 있는 값을 state에 넣을 때 사용하는 메서드 - render
UI를 렌더링하는 메서드 - componentDidMount
컴포넌트가 웹 브라우저상에 나타난 후 호출하는 메서드
- 함수형 컴포넌트의 마운트 과정
- 함수 컴포넌트 호출
- 구현부 실행
props 취득, hook 실행, 내부 변수 및 함수 생성
hook에 등록해둔 상태값, 부수함수 효과 등은 별도 메모리에 저장되어 관리됨 - return 실행
렌더링 시작 - 렌더 단계(Render Phase)
가상 DOM 생성 - 커밋 단계(Commit Phase)
실제 DOM에 반영 - useLayoutEffect()
브라우저가 화면에 paint 하기 전, useLayoutEffect에 등록해둔 부수효과 함수가 동기적으로 실행
이 때, state, redux store 등의 변경이 있다면 한 번 더 재렌더링 됨 - 페인트(Paint)
브라우저가 실제 DOM을 화면에 그림
didMount가 완료됨 - useEffect()
마운트 되어 화면이 그려진 직후, useEffect에 등록해둔 부수효과 함수가 비동기적으로 실행
***useLayoutEffect VS useEffect
1. useLayoutEffect ( 동기effect )
- useLayoutEffect에 등록된 effect는 실제DOM 반영 후, 화면이 그려지기 직전, "동기"로 실행된다.
1) (재)렌더링 시작
2) 실제DOM에 반영
3) effect 함수 동기 실행 : state 등 변경시, 다시 재렌더링 된다.
4) 화면에 Paint(didMount || didUpdate)
2. useEffect( 비동기effect )
- useEffect에 등록된 effect는 화면이 그려진 직후, "비동기"로 실행된다.
1) (재)렌더링 시작
2) 실제DOM에 반영
3) 화면에 Paint(didMount || didUpdate)
4) effect 함수 비동기 실행
** 참고: effect "구현부"와 "return 함수" 실행 순서
- didMount => effect "구현부"만 실행
- didUpdate => effect "return 함수" 실행 => effect "구현부" 실행
- willUnmount => effect "return 함수"만 실행
* Redux store 변경시, 자동으로 재렌더링 되는 이유
<Provider store={store}> 로 컴포넌트들을 감싸주면,
스토어 상태가 변경될 때마다 이를 참조하는 컴포넌트들이 재렌더링 되도록
react-redux 라이브러리가 자동으로 컴포넌트들의 렌더 함수들을 subscribe 처리
2. 업데이트(Update)
- 컴포넌트가 업데이트 하는 조건
- state가 변경될 때
- props가 변경될 때
- 부모 컴포넌트가 리렌더링 될 때
- forceUpdate로 강제 렌더링을 트리거 할 때
- 호출하는 메서드
- getDerivedStateFromProps
마운트 과정에서 호출, 업데이트가 시작하기 전에도 호출
props의 변화에 따라 state값에도 변화를 주고 싶을 때 사용 - shouldComponentUpdate
컴포넌트가 리렌더링을 해야하는지 결정하는 메서드
forceUpdate()함수를 호출한다면 이 과정을 생략하고 바로 render 함수 호출
ture 혹은 false값을 반환해야 함 - true 반환 시 render 호출, false 반환 시 여기서 작업 취소
위의 과정에서 false 반환시 컴포넌트 리렌더링이 이루어지지 않음 - render
컴포넌트 리렌더링 - getSnapshotBeforeUpdate
컴포넌트 변화를 DOM에 반영하기 바로 직전에 호출하는 메서드 - 웹 브라우저상의 실제 DOM 변화
- componentDidUpdate
컴포넌트의 업데이트 작업이 끝난 후 호출하는 메서드
- getDerivedStateFromProps
- 함수형 컴포넌트의 업데이트 과정
- 함수 컴포넌트 재호출
- 구현부 실행
props 취득, hook 실행, 내부 변수 및 함수 재생성
단, 각 hook의 특성에 따라 기존에 메모리에 저장한 내용을 적절히 활용 - return 실행
렌더링 시작 - 렌더 단계(Render Phase)
새로운 가상DOM 생성 후, 이전 가상 DOM과 비교하여, 달라진 부분을 탐색, 실제 DOM에 반영할 부분을 결정 - 커밋 단계(Commit Phase)
달라진 부분만 실제 DOM에 반영한다. - useLayoutEffect
브라우저가 화면에 Paint 하기 전에, useLayoutEffect에 등록해둔 effect(부수효과함수)가 '동기'로 실행
이 때, state, redux store 등의 변경이 있다면 한번 더 재렌더링 - 페인트(Paint)
브라우저가 실제 DOM을 화면에 그린다. didUpdate가 완료된다. - useEffect
update되어 화면이 그려진 직후, useEffect에 등록해둔 effect(부수효과함수)가 '비동기'로 실행
effect에 return부분이 있다면, 구현부보다 먼저 실행
3. 언마운트(Unmount)
- 마운트의 반대과정, 컴포넌트를 DOM에서 제거하는 것
- 호출하는 메서드
- componentWillUnmount
컴포넌트가 웹 브라우저상에서 사라지기 전에 호출하는 메서드
- componentWillUnmount
출처 : 리액트를 다루는 기술 [개정판]
리액트를 다루는 기술 [개정판]
더북(TheBook): (주)도서출판 길벗에서 제공하는 IT 도서 열람 서비스입니다.
thebook.io
https://curryyou.tistory.com/486
[React] 컴포넌트 렌더링 과정 정리(useLayoutEffect vs. useEffect)
# React 컴포넌트 재렌더링 케이스 - React 컴포넌트는 아래의 4가지 상황에서 재렌더링 된다. 1. 내부 상태값(state) 변경 2. 부모가 전해준 속성(props) 변경 3. 중앙 상태값(redux store 등) 변경 4. 부모 컴
curryyou.tistory.com
'React!' 카테고리의 다른 글
React - getDisplayMedia()로 화면공유하기 (0) | 2023.02.02 |
---|---|
React로 언어 변환하기(react-i18next) (1) | 2023.01.19 |
React의 짝꿍 Redux 뽀개기 (0) | 2022.12.13 |
React 와 Vue, Angular 장단점과 특징 (0) | 2022.12.12 |
React - JSX란? (0) | 2022.12.06 |