클래스 컴포넌트가 아닌 함수형 컴포넌트로 개발해야 한다는 것을 알게 되었다. (아무것도 모른 채 학습을 시작했던 리액트 튜토리얼의 틱택토 게임은 클래스 컴포넌트 코드를 제공한다.) 그래서 튜토리얼의 모든 컴포넌트를 함수로 리팩토링 하는데, 바로 props/state 데이터를 어떻게 처리해야 하는지에 대한 선행 학습 문제가 바로 따라온다.
그리고 친절히 클래스가 아니어도 상태 값을 관리하며 여러 React 기능을 사용할 수 있도록 지원하는 Hook API 안내가 공식 문서에 작성되어 있었다.
함수 컴포넌트에서 React의 주요 개념(상태관리, 생명주기 기능 등)을 "연동(hook into)" 할 수 있게 해준다.
"왜 Hook이 등장했을까?"
JavaScript 함수이지만 두 가지의 규칙을 준수해야 한다.
해당 규칙을 강제하기 위해 eslint-plugin-react-hooks를 제공하고 있다.
더 읽어보기: https://ko.reactjs.org/docs/hooks-rules.html
function Example() {
const [count, setCount] = useState(0);
}
this
를 가질 수 없기 때문에 this.state
를 할당하거나 읽을 수 없어, useState
Hook을 컴포넌트에 호출하여 사용한다. 기능적으로 같다.useState
의 parameter는 해당 state의 초기값이다.useState
는 state 변수, 해당 변수를 갱신할 수 있는 함수로 이뤄진 쌍을 반환한다. 따라서 구조 분해 할당(destructuring assignment)를 이용하면 한 문장으로 된 코드로 선언, 초기화할 수 있는 것이다.React의 "Effect"(=side effect)는 컴포넌트 안에서 데이터를 가져오거나 구독하고, DOM을 직접 조작하는 작업 등의 모든 동작을 뜻한다.
useEffect
는 함수 컴포넌트 내에서 side effect, 즉 렌더링 이후 어떤 일을 수행할 수 있게 해준다. (ex. 데이터 가져오기, API 불러내기 등)componentDidMount
, componentDidUpdate
, componentWillUnmount
와 같은 목적이나 하나의 API로 통합되었다.useEffect
는 컴포넌트 안에 선언되어 있으므로 props/state에 접근 가능하다.componentDidMount
에서 구독을 설정하고 componentWillUnmount
에서 구독을 해제하는 방식으로 구현할 것이다.cleanup()
이라는 이름의 함수를 반환했으나, 다른 이름으로 작성하거나 화살표 함수로 반환해도 무관하다고 한다.function Example(props) {
const [isOnline, setIsOnline] = useState(null);
function handleChatStatusChange(status) {
setIsOnline(status.isOnline);
}
useEffect(() => {
ChatAPI.subscribeChatStatus(props.id, handleChatStatusChange);
// clean-up
return function cleanup() {
ChatAPI.unsubscribeChatStatus(props.id, handleChatStatusChange);
}
});
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
React는 컴포넌트가 마운트 해제될 때 정리를 실행한다.
useEffect
don't block the browser from updating the screen.: 한국어로 된 공식 문서의 문장이 괜히 더 헷갈리는 것 같아 원문 첨부. 아마 effect 내 코드를 수행하는 동안 일어나는 브라우저의 화면 렌더링 작업이 비동기로 계속 이루어질 수 있다는 뜻 같다.useEffect
의 두 번째(선택적) parameter로 배열을 작성한다.(더 공부하고 이해해야 하는 사항)
exhaustive-deps
규칙을 eslint-plugin-react-hooks
패키지에 포함하면 의존성이 바르지 않게 지정되었을 때 경고해준다.Hooks API Reference 공식 문서로 공부할 것.