개요
_Hook_을 사용하면 컴포넌트에서 다양한 React 기능을 사용할 수 있습니다. 내장된 Hook을 이용하거나 이를 결합하여 자신만의 Hook을 만들 수 있습니다. 이 페이지에는 React에 내장된 모든 Hook이 나열되어 있습니다.
State Hooks
_State_는 컴포넌트가 사용자 입력 등 정보를 "기억"할 수 있게 해줍니다. 예를 들어, 폼 컴포넌트는 입력값을, 이미지 갤러리 컴포넌트는 선택된 이미지 인덱스를 state로 저장할 수 있습니다.
컴포넌트에 state를 추가하려면 다음 Hook 중 하나를 사용하세요.
useState
: 직접 업데이트할 수 있는 state 변수를 선언합니다.useReducer
: reducer 함수 내부의 업데이트 로직을 사용하여 state 변수를 선언합니다.
function ImageGallery() {
const [index, setIndex] = useState(0);
// ...
}
Context Hooks
_Context_는 컴포넌트가 props를 전달하지 않고도 멀리 있는 부모 컴포넌트로부터 정보를 받을 수 있게 해줍니다. 예를 들어, 앱의 최상위 컴포넌트는 현재 UI 테마를 아래의 모든 컴포넌트에 깊이와 상관없이 전달할 수 있습니다.
useContext
: context를 읽고 구독합니다.
function Button() {
const theme = useContext(ThemeContext);
// ...
}
Ref Hooks
_Ref_를 사용하면 컴포넌트가 DOM 노드나 timeout ID 등 렌더링에 사용되지 않는 정보를 보유할 수 있습니다. state와 달리, ref를 업데이트해도 컴포넌트가 다시 렌더링되지 않습니다. ref는 React 패러다임의 "탈출구"로, 내장 브라우저 API 등 React가 아닌 시스템과 작업할 때 유용합니다.
useRef
: ref를 선언합니다. 어떤 값이든 담을 수 있지만, 주로 DOM 노드를 담는 데 사용됩니다.useImperativeHandle
: 컴포넌트에 노출되는 ref를 커스텀할 수 있습니다. (드물게 사용)
function Form() {
const inputRef = useRef(null);
// ...
}
Effect Hooks
_Effect_를 통해 컴포넌트를 외부 시스템에 연결하고 동기화할 수 있습니다. 여기에는 네트워크, 브라우저 DOM, 애니메이션, 다른 UI 라이브러리로 작성된 위젯 등 React가 아닌 코드를 다루는 것이 포함됩니다.
useEffect
: 컴포넌트를 외부 시스템에 연결합니다.
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]);
// ...
}
Effect는 React 패러다임의 "탈출구"입니다. 외부 시스템과 상호작용하지 않는다면 Effect가 필요하지 않을 수도 있습니다.
useEffect
의 드물게 사용되는 변형:
useLayoutEffect
: 브라우저가 화면을 다시 그리기 전에 실행. 레이아웃 측정에 사용.useInsertionEffect
: React가 DOM을 변경하기 전에 실행. 라이브러리에서 동적 CSS 삽입에 사용.
Performance Hooks
재렌더링 성능을 최적화하는 일반적인 방법은 불필요한 작업을 건너뛰는 것입니다. 예를 들어, 이전 렌더링 이후 데이터가 변경되지 않았다면 캐시된 계산을 재사용하거나 재렌더링을 건너뛰도록 React에 지시할 수 있습니다.
useMemo
: 비용이 많이 드는 계산 결과를 캐시합니다.useCallback
: 함수 정의를 최적화된 컴포넌트에 전달하기 전에 캐시합니다.
function TodoList({ todos, tab, theme }) {
const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]);
// ...
}
화면을 실제로 업데이트해야 하므로 재렌더링을 건너뛸 수 없는 경우, 동기식이어야 하는 blocking 업데이트(예: 입력)와 non-blocking 업데이트(예: 차트 업데이트)를 분리하여 성능을 향상시킬 수 있습니다.
useTransition
: state 전환을 non-blocking으로 표시, 다른 업데이트가 이를 중단하도록 허용.useDeferredValue
: UI의 중요하지 않은 부분에 대한 업데이트를 지연, 다른 부분이 먼저 업데이트되도록 함.
기타 Hooks
다음 Hook은 주로 라이브러리 작성자에게 유용하며, 애플리케이션 코드에서는 일반적으로 사용되지 않습니다.
useDebugValue
: 커스텀 Hook에 대해 React DevTools에 표시하는 레이블을 커스텀.useId
: 컴포넌트가 고유 ID를 자신과 연결. 주로 접근성 API와 함께 사용.useSyncExternalStore
: 컴포넌트가 외부 저장소를 구독.useActionState
: 액션을 통해 state를 관리.
나만의 Hooks
자바스크립트 함수로 자신만의 커스텀 Hook을 정의할 수도 있습니다.
목차
- 개요
- State Hooks
- Context Hooks
- Ref Hooks
- Effect Hooks
- Performance Hooks
- 기타 Hooks
- 나만의 Hooks