Hook 소개
개요
- Hook React 16.8 부터 React 요소로 새로 추가되었다.
- Hook 선택적으로 사용이 가능하다.
- 100% 이전 버전과의 호환성을 유지한다.
- React에서 class는 제거될 계획이 없다.
동기
- 컴포넌트 사이에서 상태 로직을 재사용 하기 어렵다.
- React는 컴포넌트간에 재사용 가능한 로직을 붙이는 방법을 제공하지 않았다.
- 상태관련 로직을 공유하기 위해 더 좋은 기초 요소가 필요했다.
- Hook을 사용하면 컴포넌트로부터 상태 관련 로직을 추상화할 수 있다.
- 이는 독립적은 테스트와 재사용이 가능하게 한다.
- Hook은 계층의 변화 없이 상태 관련 로직을 재사용할 수 있도록 돕는다.
- 복잡한 컴포넌트들은 이해하기 어렵다.
- class는 여러 생명 주기가 있는데, 여러 생명 주기에서 데이터가 세팅되었다.
- 서로 관련없는 내용들은 생명주기에 따라 묶여 처리 되었다.
- 이 때문에 분리 및 테스트가 어려운 구조가 되었다.
- 생명주기로 쪼개는 것 보다는 Hook을 통해 서로 비슷한 것을 하는 작은 함수의 묶음으로 컴포넌트를 나누는 방법을 사용하는 것이 바람직하다.
- Class는 사람과 기계를 혼동시킨다.
- this 키워드는 다른 대부분의 언어와 다르게 동작하여 사용자에게 혼란을 주었다.
- 코드의 재사용성과 구성을 어렵게 만들기도 했다.
Hook 개요
state Hook
import React, { useState } from 'react';
function Example() {
// "count"라는 새 상태 변수를 선언합니다
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
- useState가 바로 hook이다.
- useState를 저장된 값을 돌려주는 getter 와 값을 저장하는 setter로 구성된다.
- 위에서는 count가 getter, setCount가 setter의 역할을 한다.
- useState는 인자로 초기값을 전달 받는다.
- useState(0) 으로 선언하면 count에는 0이 초기값으로 할당된다.
Hook이 무엇인가요?
- Hook은 함수 컴포넌트에서 React state와 생명주기 기능(Lifecycle features)을 "연동(hook into)"할 수 있게 해주는 함수이다.
- Hook은 클래스 안에서는 동작하지 않는다.
- 대신 class 없이 React를 사용할 수 있게 해준다.
Effect Hook
- React 컴포넌트 안에서 데이터를 가져오거나 구독하고, DOM을 직접 조작하는 작업을 하는데 이런 모든 동작을 "side effects"라고 한다.
- 이런 작업들은 다른 컴포넌트에 영향을 줄 수도 있고, 렌더링 과정에서는 구현할 수 없는 작업이기 떄문이다.
- Effect Hook, 즉 useEffect 함수 컴포넌트 내에서 이런 side effects를 수행할 수 있게 해준다.
- React class의 componentDidMount 나 componentDidUpdate, componentWillUnmount와 같은 목적으로 제공되지만, 하나의 API로 통합된 것이다.
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// componentDidMount, componentDidUpdate와 비슷합니다
useEffect(() => {
// 브라우저 API를 이용해 문서의 타이틀을 업데이트합니다
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
- useEffect를 사용하면, React는 DOM을 바꾼 뒤에 " effect" 함수를 실행한다.
- effect는 컴포넌트 안에 선언되어 있기 때문에 props와 state에 접근할 수 있다.
- 기본적으로 React는 매 렌더링 이후에 effects를 실행한다.
Effect 해제
import React, { useState, useEffect } from 'react';
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null);
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
useEffect(() => {
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
- Effect의 해제가 필요하면 useEffect안에 return 을 사용하여 해제하는 함수를 반환해주면 되며, 이는 optional이다.
- 위 예에서는 컴포넌트가 unmount 될 때 React는 ChatAPI에서 구독을 해지할 것이다.
Hook의 사용 규칙
- 최상위에서만 Hook을 호출해야 한다. 반복문, 조건문, 중첩된 함수 내에서 Hook을 실행시키면 안된다.
- React 함수 컴포넌트 내에서만 Hook을 호출해야한다.
- 일반 자바스크립트 함수내에서 Hook을 호출하면 안된다.
- 직접 작성한 custom Hook에서는 호출할 수 있다.
참조
- 패스트 캠퍼스 온라인 강좌(한 번에 끝내는 React의 모든 것 초격자 패키지 Online)