LifeCycle API
이 API 는 컴포넌트가 브라우저에서 나타날때, 사라질때, 그리고 업데이트 될 때, 호출되는 API이다. 참고로 컴포넌트가 렌더링 된다고 해서 무조건 브라우저에서 다시 그려지는 것이 아니다. 일단 Virtual DOM에 그리고 실제로 변하는 곳이 브라우저의 실제 DOM에 반영된다.
컴포넌트는 언제 렌더링 될까?
- props 바뀔 때
- state 바뀔 때
- 부모 컴포넌트가 렌더링 될 때
- this.forceUpdate()함수를 통해 강제 렌더링
렌더링 순서는 어떻게 될까
- Mounting: 컴포넌트가 브라우저상에 나타난다는 것
- Updating: 컴포넌트의 props나 state가 바뀌었을 때
Unmounting: 컴포넌트가 브라우저상에서 사라질 때
constructor -> getDerivedStateFromProps -> render -> componentDidMount 순으로 렌더링이 진행된다.
첫 화면 랜더링 후 props가 바뀔경우 getDerivedStateFromProps -> shouldComponentUpdate 과정을 거치며 false일 경우 종료, true일 경우 render -> getSnapshotBeforeUpdate -> componentDidUpdate 후 종료된다. state가 바뀔 경우에는 바로 shouldComponentUpdate 부터 라이프사이클이 진행된다.
1. Mounting (컴포넌트 초기 생성)
constructor
constructor(props) { super(props); }
컴포넌트 생성자 함수. 컴포넌트가 새로 만들어질 때마다 이 함수가 호출된다. 가장 먼저 실행되는 함수. 주로 컴포넌트가 가지고 있을 state를 초기화. 아니면 컴포넌트가 만들어지기 전에 미리 해야할 작업을 정해줌.
getDerivedStateFromProps
static getDerivedStateFromProps(nextProps, prevState) { // ... }
props로 받은 값을 state에 동기화시키고 싶을 때. Mounting 과정에서도 실행되고 props가 Updating 될때도 실행된다. static 값으로 넣어주어야 한다.
componentDidMount
componentDidMount() { // ... }
컴포넌트가 화면에 나타나게 됐을 때 호출된다. D3, masonry처럼 DOM을 사용해야하는 외부 라이브러리 연동을 하거나, 해당 컴포넌트에서 필요로 하는 데이터를 요청하기 위해 ajax 요청을 하거나, DOM의 속성을 읽거나 직접 변경하는 작업을 진행한다.
2. Updating(컴포넌트 업데이트)
shouldComponentUpdate
shouldComponentUpdate(nextProps, nextState) { // return false 하면 업데이트를 안 함 return true; }
컴포넌트를 최적화하는 작업에서 매우 유용하게 사용됨. state가 변경되거나 부모 컴포넌트로부터 새로운 props를 전달받을 때 실행된다. 리액트는 이 메소드의 반환 값에 따라서 re-render를 할지에 대한 여부를 결정한다.
기본적으로 shouldComponentUpdate 메소드는 true를 반환한다. 하지만 원하지 않을 경우 이 return value를 false로 만들 수도 있다.getSnapshotBeforeUpdate
getSnapshotBeforeUpdate(prevProps, prevState) { // ... }
렌더링을 하고나서 업데이트를 바로 하기 전에 스크롤의 위치, 아니면 해당 돔의 크기를 가져오고 싶다… 등등 할때 사용.
componentDidUpdate
componentDidUpdate(prevProps, prevState, snapshot) { // ... }
컴포넌트에서 render() 를 호출하고난 다음에 발생. 예를 들어 state 가 변경되었으면 이전의 상태와 지금의 상태를 비교했을 때 만약 다르다면 작업을 해라… 등등 할때 사용.
3. Unmounting(컴포넌트 제거)
componentWillUnmount
componentWillUnmount() { // ... }
여기서는 주로 등록했었던 이벤트를 제거한다. 여기서 이벤트 등록은 주로 componentDidMount 에서 등록했던 이벤트임.
4. 기타 (에러 발생)
componentDidCatch
componentDidCatch(error, info) { this.setState({ error: true }); }
컴포넌트 자신의 render 함수에서 에러가 발생해버리는 것은 잡아낼 수는 없지만, 그 대신에 컴포넌트의 자식 컴포넌트 내부에서 발생하는 에러들을 잡아낼 수 있다. 즉 자식 컴포넌트의 에러를 부모 컴포넌트가 잡아낸다.