React Component 의 라이프사이클 이벤트
2019. 4. 1. 21:44ㆍcoding
-
이벤트 분류
- 마운팅 (한번만 실행) → 갱신 (여러번 실행) → 언마운팅 (한번만 실행)
constructor()
: 엘리먼트를 생성하여 기본 속성과 상태를 설정할 때 실행된다.componentWillMount()
: DOM에 삽입하기 전에 실행된다.componentDidMount()
: DOM에 삽입되어 렌더링이 완료된 후 실행된다.componentWillReceiveProps(nextProps)
: 컴포넌트가 속성을 받기 직전에 실행된다.shouldComponentUpdate(nextProps, nextState)
: 컴포넌트가 갱신되는 조건을 정의해서 재렌더링을 최적화할 수 있다. 불 값을 반환한다.componentWillUpdate(nextProps, nextState)
: 컴포넌트가 갱신되기 직전에 실행된다.componentDidUpdate(prevProps, prevState)
: 컴포넌트가 갱신된 후에 실행된다.componentWillUnmount()
: 컴포넌트를 DOM에서 제거하기 전에 실행되며, 구독한 이벤트를 제거하거나 다른 정리 작업을 수행할 수 있다.
-
이벤트 구현
- 라이프사이클 이벤트를 구현하려면 클래스에 메서드를 정의해야 한다.
- 예를 들어
componentDidMount()
를 정의하면 컴포넌트 클래스의 엘리먼트가 DOM에 추가되었을 때 메서드를 호출한다. 이 메서드는 다른 프론트엔드 프레임워크나 라이브러리와 통합하는 코드나, 서버에 요청을 보내는 코드를 작성할 때 사용된다. 라이프사이클의 마운팅 시점에는 컴포넌트의 엘리먼트가 실제 DOM에 반영되어 자식 엘리먼트를 포함한 모든 엘리먼트에 접근할 수 있기 때문이다. 모든 렌더링 작업이 완료된 후에 실행된다. 만약componentDidMount()
를 정의하지 않는다면 이 이벤트에 대해 아무런 코드도 실행하지 않는다.
-
componentWillMount
- v16.3 이후부터는
UNSAFE_componentWillMount()
로 사용 (더이상 사용 X)
- v16.3 이후부터는
-
componentDidMount
- 외부 라이브러리 연동, 컴포넌트에서 필요한 데이터 요청 시 (Ajax, GraphQL..), DOM에 관련된 작업 (스크롤 설정, 크기 읽어오기 등)
- 컴포넌트가 화면에 나타나게 됐을 때 호출된다.
-
componentWillReceiveProps
componentWillReceiveProps(nextProps)
형태로 사용- 컴포넌트가 새로운 props 받게될 때 호출 → 주로 state가 props에 따라 변해야 하는 로직을 작성. 새로 받게 될 props는 nextProps로 조회할 수 있으며, 이 때 this.props를 조회하면 업데이트 되기 전의 API가 된다.
- v16.3부터
UNSAFE_componentWillReceiveProps()
로 사용. 이 기능은 상황에 따라 새로운 API getDerivedStateFromProps로 대체될 수 있다.
-
static getDerivedStateFromProps(nextProps, prevState)
-
props로 받아온 값을 state로 동기화하는 작업을 해주어야 하는 경우에 사용
-
setState를 하는 것이 아니라 특정 props가 바뀔 때 설정하고, 설정하고 싶은 state 값을 리턴하는 형태로 사용.
static getDerivedStateFromProps(nextProps, prevState) { if (nextProps.value !== prevState.value) { return {value: nextProps.value}; } return null; //따로 업데이트 할 것은 없다. }
-
-
shouldComponentUpdate
return false
시 따로 업데이트 하지 않음- 컴포넌트를 최적화하는 작업에서 유용하게 사용된다. 기본적으로 true를 반환하고 Virtual DOM에 리렌더링 하는것이 붎필요한 경우 방지하기 위해서 조건에 따라 false를 반환하면 해당 조건에는 render 함수를 호출하지 않는다.
-
componentWillUpdate
- shouldComponentUpdate에서 true를 반환했을때만 호출
- 애니메이션 효과를 초기화하거나 이벤트 리스너를 없애는 작업을 하고, 함수가 호출되고 난 다음에는 render()가 호출된다.
- 기존 기능은 v16.3 이후
getSnapshotBeforeUpdate
로 대체 가능
-
getSnapshotBeforeUpdate(prevProps, prevState)
- API가 발생하는 시점
- render()
- getSnapshotBeforeUpdate()
- 실제 DOM에 변화 발생시
- componentDidUpdate
- 이 API를 통해서 DOM 변화가 일어나기 직전의 DOM 상태를 가져오고, 여기서 리턴하는 값은 componentDidUpdate에서 3번째 파라미터로 받아올 수 있다.
- getSnapshotBeforeUpdate 자세히 알아보기
- API가 발생하는 시점
-
componentDidUpdate(prevProps, prevState, snapshot)
- 컴포넌트에서 render()를 호출하고 난 다음에 발생. 이 시점에서는 this.props 와 this.state가 바뀌어 있고 파라미터를 통해 이전 값인 prevProps와 prevState를 조회할 수 있다.
- getSnapshotBeforeUpdate에서 반환한 snapshot 값은 세번째로 받아온다.
-
컴포넌트에 에러 발생시
componentDidCatch(error, info) { this.setState({ error: true }); }
- componentDidCatch를 실행되게 하여 render에서 에러를 띄워준다.
'coding' 카테고리의 다른 글
파이썬으로 기사 크롤링하기 (0) | 2019.04.02 |
---|---|
개발과 관련해서 읽어볼 링크들 (0) | 2019.04.01 |
확장성을 고려한 리액트 컴포넌트 (0) | 2019.04.01 |
객체지향의 사실과 오해 (0) | 2019.04.01 |
C 프로그래밍 : 구조체와 사용자 정의 자료형 (0) | 2018.10.01 |