엄청 빠르게 돌아온 효그니가 이번에 설명할 것은 React Component의 생명주기입니다.
저번에 설명했듯이 Component 는 클래스형, 함수형 이 두 가지가 있다고 했었죠?
각각의 Component의 생명주기 방식이 다릅니다.
Class Component
class Test extends React.Component {
componentWillMount() {
console.log('componentWillMount');
}
componentDidMount() {
console.log('componentDidMount');
}
componentWillReceiveProps(nextProps) {
console.log('componentWillReceiveProps');
}
shouldComponentUpdate(nextProps, nextState) {
console.log('shouldComponentUpdate');
return true / false;
}
componentWillUpdate(nextProps, nextState) {
console.log('componentWillUpdate');
}
componentDidUpdate(prevProps, prevState) {
console.log('componentDidUpdate');
}
componentWillUnmount() {
console.log('componentWillUnmount');
}
render() {
return <div></div>;
}
}
( 이걸로 끝이 아니라 더 있습니다.. 하와와.. 남고생쟝.. 눈아프다요...)
먼저 클래스형 Component의 생명주기입니다.
상당히 많지만, 위의 것들을 전부 사용할 필요는 없습니다!
React v17 부터는 componentWillMount, componentWillUpdate, componentWillReceiveProps가 비추천 됩니다.
( 원문 - deprecated )
쓰이지 않게 되거나 대체될 수 있습니다. 사용하시지 않는 것을 추천드립니다!
설명에 앞서 Mount, Update ( Props, State ), Unmount, Error 이렇게 크게 4가지로 분류하겠습니다.
Mount
컴포넌트를 처음 실행시켰을 때의 상태를 Mount라고 표현합니다.
<Test/> // 태그 형태로 사용했어서 헷갈릴 수도 있으시겠지만, 컴포넌트도 함수입니다!
state, props, context 저장 → componentWillMount → render() → componentDidMount
순으로 실행된다고 보시면 될 것 같습니다.
componentWillMount
Component가 Mount 되기 전 입니다.
주의할 점으로
- componentWillMount 내에서 props, state를 바꿔서는 안됩니다. Mount 중이기 때문입니다.
- DOM에 접근할 수 없습니다. render 함수가 작동되기 전이기 때문입니다.
componentDidMount
Component가 Mount 된 후 입니다.
will과는 다르게 DOM 에도 접근할 수 있습니다!
여기서 주로 서버에 데이터를 요청합니다.
아마 여러분이 개발하시면서 가장 많이 쓰일 생명주기입니다!
Update - Props
Props 가 업데이트 될 때의 경우에 발생합니다!
componentWillReceiveProps → shouldComponentUpdate → componentWillUpdate → render() → componentDidUpdate
순으로 실행됩니다.
componentWillReceiveProps
props가 변경되었을 때를 감지하고 가장 먼저 실행됩니다!
shouldComponentUpdate
componentWillReceiveProps 가 실행된 후 실행됩니다!
단어 뜻 그대로 진짜 Component 업데이트 할거야? 라는 기능을 갖고 있습니다.
shouldComponentUpdate(nextProps, nextState) {
console.log('shouldComponentUpdate');
return true / false;
}
true / false 를 통해 "render를 선택적으로 취소" 할 수 있습니다.
성능 최적화에 있어 중요하겠죠?
componentWillUpdate
Component가 업데이트 될 때 입니다.
주의할 점으로 여기서 state를 바꾸게 되면 componentWillUpdate가 한 번 더 일어나게 됩니다.
Mount 의 willMount와 비슷합니다.
componentDidUpdate
Component가 업데이트 된 후 입니다.
DOM에의 접근도 가능하고, state를 변경하셔도 됩니다.
Update - State
state가 업데이트 될 때 입니다. ( setState )
props의 업데이트와 과정이 같아 간략히 하겠습니다.
차이점으로는
- componentWillReceiveProps 는 호출되지 않는다.
- 메소드들이 바뀔 state에 대한 정보를 갖고 있으며, componentDidUpdate는 바뀌기 전의 state를 갖고 있습니다.
shouldComponentUpdate → componentWillUpdate → render() → componentDidUpdate
순으로 실행됩니다.
props의 update 와는 다른 점으로 state를 비교하며 업데이트 할 수 있습니다!
업데이트를 직접 비교하여 선택적으로 할 수 있는 것도 React의 강점 중 하나죠! 크윽 강해!
Unmount
Mount에 Un이 붙었네요? 컴포넌트가 제거될 때 입니다!
componentWillUnmount 이 있습니다. Did는 없습니다. 컴포넌트가 제거 되었기 때문에.. ( 죽은 자는 말이 없다.. )
주로 addEventListener등으로 추가한 리스너를 제거하거나, clear와 관련된 행동을 이 안에서 실행합니다.
Error
에러가 발생했을 때 입니다.
componentDidCatch
서버 통신에 실패했을 때의 에러 페이지 등을 만들 때 사용합니다. ( Error Boundary )
Functional Component
클래스형 컴포넌트에 비해 무척이나 간단합니다.
추가된 hooks api를 사용하여 쉽고 간단하면서도 클래스형 컴포넌트에서 작동하는 기능을 사용할 수 있습니다.
import React, { useState, useEffect } from 'react';
const Test = () => {
const [isOpen, setIsOpen] = useState(false); // 임의의 State
useEffect(() => {
console.log('componentDidMount');
return () => { // 컴포넌트가 제거될 때 사용됩니다.
console.log('componentWillUnmount');
}
}, []); // 배열에 아무 것도 없다면 첫 랜더링 때만 실행됩니다.
useEffect(() => {
console.log('componentDidMount + componentDidUpdate');
}, [isOpen]); // 첫 랜더링, 배열 안의 값이 변할 때 실행됩니다.
return <div></div>;
};
hooks api 중, useEffect를 사용합니다.
매우 간단하죠? 하핳!
클래스형 컴포넌트와는 다르게 업데이트에 있어 실행할 동작을 useEffect를 통해 추가합니다.
useMemo, useRef 등 다른 hooks api를 사용하여 심화된 생명주기와 기능을 다룰 수 있습니다.
hooks api에 대해서는 차후에 다루겠습니다!
이상으로 글을 마치겠습니다!
오늘도 열심히 하는 여러분들이 최고임돠 ^^7
'JavaScript > React.js Lecture' 카테고리의 다른 글
6. React View, Component 반복, 조건부 랜더링 (0) | 2020.11.19 |
---|---|
5. React Router (0) | 2020.11.19 |
3. React State (0) | 2020.11.16 |
2. React Component (props, state, Class Component, Functional Component) (0) | 2020.11.15 |
1. React란? 그리고 CRA 설정 (0) | 2020.11.15 |