컴포넌트가 처음 실행될 때 그것을 Mount라고 표현합니다. 컴포넌트가 시작되면 우선 context, defaultProps와 state를 저장합니다. 그 후에componentWillMount메소드를 호출합니다. 그리고render로 컴포넌트를 DOM에 부착한 후 Mount가 완료된 후componentDidMount가 호출됩니다.
주의할 점은, componentWillMount에서는 props나 state를 바꾸면 안 됩니다. Mount 중이기 때문이죠. 그리고 아직 DOM에 render하지 않았기 때문에 DOM에도 접근할 수 없습니다.
componentDidMount에서는DOM에 접근할 수 있습니다. 그래서 여기에서는 주로 AJAX 요청을 하거나, setTimeout, setInterval같은 행동을 합니다.
정리하면 다음 순서로 실행됩니다.
state, context, defaultProps 저장
componentWillMount
render
componentDidMount
Props Update
props가 업데이트될 때의 과정입니다. 업데이트되기 전에 업데이트가 발생하였음을 감지하고,componentWillReceiveProps메소드가 호출됩니다. 그 후shouldComponentUpdate,componentWillUpdate가 차례대로 호출된 후, 업데이트가 완료(render)되면componentDidUpdate가 됩니다. 이 메소드들은 첫 번째 인자로 바뀔 props에 대한 정보를 가지고 있습니다. componentDidUpdate만 이미 업데이트되었기 때문에 바뀌기 이전의 props에 대한 정보를 가지고 있습니다.
shouldcomponentUpdate에서는 아직 render하기 전이기 때문에 return false를 하면 render을 취소할 수 있습니다. 주로 여기서성능 최적화를 합니다. 쓸데없는 update가 일어나면 여기서 걸러내는 거죠.
주의사항이 있는데, componentWillUpdate에서는 state를 바꿔서는 안 됩니다. 아직 props도 업데이트하지 않았으므로 state를 바꾸면 또 shouldComponentUpdate가 발생합니다. componentDidUpdate에서는 render이 완료되었기 때문에DOM에 접근할 수 있습니다.
componentWillReceiveProps
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate
State Update
setState 호출을 통해 state가 업데이트될 때의 과정입니다. props update와 과정이 같지만, componentWillReceiveProps 메소드는 호출되지 않습니다. 그리고 메소드의 두 번째 인자로는 바뀔 state에 대한 정보를 가지고 있습니다. componentDidUpdate는 두 번째 인자로 바뀌기 이전의 state에 대한 정보를 가지고 있습니다.
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate
Unmount
컴포넌트가 제거되는 것은 Unmount라고 표현합니다. 더는 컴포넌트를 사용하지 않을 때 발생하는 이벤트가 있습니다.componentWillUnmount가 그것입니다. componentDidUnmount는 없습니다. 이미 제거된 컴포넌트에서 이벤트를 발생시킬 수는 없겠죠? componentWillMount에서 주로 연결했던 이벤트 리스너를 제거하는 등의 여러 가지 정리 활동을 합니다.
componentWillUnmount
다행히도 용도에 맞지 않는 메소드를 사용하면 React에서 자체적으로 에러 메시지를 띄워 줍니다. componentDidMount나 render에 setState를 사용한 경우도 에러 메시지를 띄웁니다. 그래도 혹시나 모를 상황에 대비하여 용도를 항상 알고 있는 게 좋겠습니다. 다음 시간에는React-router에 대해 알아봅시다.
Error
에러 발생 시를 위한 componentDidCatch도 있습니다. 리액트 16에서 추가되었습니다.
componentWillReceiveProps()는 마운트된 컴포넌트가 새로운 props를 전달받기 전에 호출된다. 그러나 이 메서드를 사용하면 버그를 만들거나 일관성을 해칠 수 있다.
- props 변화에 대응한 효과를 발생시켜야 한다면 (Ex: 데이터를 가져오기 또는 에니메이션 등...) componentDidUpdate()생명주기를 사용하기를 권한다. - props가 변화할 때 일부 state를 재설정하기 위해서는 완전 제어 컴포넌트또는Key를 사용하는 완전 비제어 컴포넌트를 만들어서 사용하라고 공식 문서는 권한다.
componentWillUpdate()
componentWillUpdate() 는 새로운 props 또는 state가 전달되어서 렌더링이 이루어지기 전에 호출된다. 이 메서드는 초기 렌더링에서는 호출 되지 않는다.
또한 이 메서드 내에서는 this.setState() 를 호출 할 수 없다. 또한 React 컴포넌트가 갱신되도록 만드는 그 어떤 작업eh componentWillUpdate() 가 결과값을 반환하기 전에 이루어 져서는 안된다.
componentWillUpdate() 는 shouldComponentUpdate() 메서드가 false 를 반환한다면 호출되지 않는다.
componentWillUpdate() 는 componentDidUpdate() 로 대체할 수 있다. 만약 메서드내에서 DOM 에 대한 정보 획득 (Ex: 스크롤 위치 저장 등..) 을 하려 한다면 getSnapshotBeforeUpdate() 를 사용하는것이 가능하다.