리액트를 다루는 기술 7장 스터디
by ag-lee
7. 컴포넌트의 라이프사이클 메서드
라이프 사이클 메서드는 함수형 컴포넌트에서는 사용할 수 없고, 클래스형 컴포넌트에서만 사용이 가능하다.
라이프사이클 메서드의 이해
Will
: 작업을 작동하기 __전__에 실행되는 메서드Did
: 작업을 작동한 __후__에 실행되는 메서드
라이프 사이클은 크게 __마운트, 업데이트, 언마운트__로 나뉜다.
마운트(Mount)
페이지에 컴포넌트가 나타남. DOM이 생성되고 웹 브라우저 상에 나타나는 것.
메서드 호출 순서
constructor
-> getDerivedStateFromProps
-> render
-> componentDidMount
업데이트(Update)
컴포넌트 정보를 업데이트
업데이트가 일어나는 경우
- props, state가 바뀔 때
- 부모 컴포넌트가 리렌더링될 때
this.forceUpdate
로 강제로 렌더링을 트리거할 때
메서드 호출 순서
getDerivedStateFromProps
-> shouldComponentUpdate
-> (true 반환 시 render 호출, false 반환 시 작업 취소) -> render
-> getSnapshotBeforeUpdate
-> 실제 Dom Update -> componentDidUpdate
this.forceUpdate
시에는 render 부터 시작한다.
- shouldComponentUpdate : 컴포넌트가 리렌더링을 할지말지 결정하는 메소드. boolean 값을 반환해야 한다.
- getSnapshotBeforeUpdate : 컴포넌트 변화를 DOM에 반영하기 직전 호출하는 메서드.
언마운트(Unmount)
페이지에서 컴포넌트가 사라짐. DOM에서 컴포넌트를 제거하는 것. 마운트의 반대 과정
메서드 호출 순서
componentWillUnmount
라이프 사이클 메서드
render() 함수
컴포넌트의 모양새를 정의하는 함수.
메서드 내에서 this.props
와 this.state
에 접근이 가능하고, 리액트 element를 반환한다. 이 때 null이나 false를 반환하면 아무것도 렌더링하지 않는다.
주의할 점
- 이벤트 설정이 아닌 곳에서
setState
를 사용할 수 없다. - 브라우저의 DOM에 접근하면 안된다.
두 가지가 필요한 경우는 마운팅된 후 componentDidMount
에서 처리한다.
constructor
생성자. 컴포넌트를 만들 때 처음으로 실행되고 초기 state를 정할 수 있다.
getDerivedStateFromProps 메서드
컴포넌트가 마운트될 때, 업데이트될 때 호출되며 props로 받아 온 값을 state에 동기화하는 용도로 주로 사용된다.
static getDerivedStateFromProps(nextProps, prevState) {
if (nextProps.value !== prevState.value) {
return { value: nextProps.value };
}
return null; // state를 변경할 필요가 없다면 null을 반환
}
componentDidMount 메소드
컴포넌트를 만들고 렌더링을 마친후 실행. 다른 자바스크립트 라이브러리 또는 프레임워크의 함수를 호출하거나 이벤트 등록, setTimeout, setInterval, 네트워크 요청 같은 비동기 작업을 주로 처리한다.
shouldComponentUpdate 메서드
Props 또는 state를 변경했을 때, 리렌더링을 시작할지 여부를 지정하는 메서드. boolean 갑을 반환해 계속 진행할지 결정한다. 컴포넌트를 만들 때 메서드를 따로 생성하지 않으면 언제나 true를 반환하고, false를 반환하면 업데이트 과정이 중지된다.
현재 props와 state는 this.props
와 this.state
로 접근하고, 새로 생성될 props와 state는 nextProps
와 nextState
로 접근할 수 있었습니다.
getSnapshotBeforeUpdate 메서드
render에서 만들어진 결과물이 실제 브라우저에 반영되기 직전에 호출. 이 메서드에서 반환하는 값을 componentDidUpdate
에서 세 번째 파라미터인 snapshot 값으로 전달받아 사용한다. 주로 업데이트 직전의 값을 참고할 때 활용된다.
getSnapshotBeforeUpdate(prevProps, prevState) {
if (prevState.array !== this.state.array) {
const {scrollTop, scrollHeight} = this.list
return {scrollTop, scrollHeight};
}
}
componentDidUpdate 메세드
리렌더링을 완료한 후 실행한다. 업데이트가 끝난 직후이므로 DOM 관련 처리를 해도 무방합니다. prevProps 또는 prevState를 사용하여 컴포넌트가 이전에 가졌던 데이터에 접근할 수 있다. getSnapshotBeforeUpdate에서 반환한 값이 있으면 snapshot 값을 전달받을 수 있다.
componentWillUnmount 메서드
컴포넌트를 DOM에서 제거할 때 실행한다. componentDidMount에서 등록한 이벤트, 타이머, 직접 생성한 DOM이 있다면 여기서 제거 작업을 해야합니다.
componentDidCatch 메서드
컴포넌트 렌더링 도중에러가 발생했을 때 오류 UI를 보여줄 수 있다.
componentDidCatch(error, info) {
this.setState({
error: true
});
console.log({error, info});
}
error는 파라미터에 어떤 에러가 발생했는지 알려주고, info는 어디에 있는 코드에서 오류가 발생했는지 알려준다. **
리액트를 다루는 기술 요약 정리 https://book.naver.com/bookdb/book_detail.nhn?bid=15372757