React Hook은 React 16.8 버전에서 도입된 기능으로, 함수형 컴포넌트에서도 상태 관리 및 여러 React의 기능들을 사용할 수 있게 해주는 함수들입니다. 이전에는 클래스 컴포넌트에서만 상태 관리나 생명주기 기능을 사용할 수 있었지만, Hook을 통해 함수형 컴포넌트에서도 이러한 기능들을 쉽게 사용할 수 있게 되었습니다.
Hook은 React 함수 컴포넌트의 최상위 레벨에서만 호출해야 한다. 반복문, 조건문, 중첩된 함수 내에서 Hook을 호출하면 안 된다. 이 규칙은 Hook이 매 컴포넌트 렌더링마다 동일한 순서로 호출되어야 한다는 것을 보장하기 위함이다. 이러한 일관성은 React가 내부적으로 각 Hook의 상태를 올바르게 추적하는 데 필요하다.
Hook은 React의 함수 컴포넌트 내부 또는 다른 Hook(Custom Hook) 내부에서만 호출해야 합니다. 일반 JavaScript 함수에서 React Hook을 호출해서는 안 됩니다. 커스텀 Hook을 통해 로직을 재사용할 수 있으며, 이는 Hook의 규칙을 준수하는 한 방법입니다.
useState는 React에서 함수형 컴포넌트의 상태 관리를 위해 제공하는 Hook이다. 이를 통해 클래스 컴포넌트에서만 가능했던 상태 관리 기능을 함수형 컴포넌트에서도 사용할 수 있게 되었다. useState는 현재 상태를 나타내는 state값과 이 상태를 업데이트하는 setState값을 쌍으로 제공한다.
useState 함수는 초기 상태를 인자로 받고, 배열을 반환한다. 이 배열의 첫 번째 요소는 현재 상태 값이고, 두 번째 요소는 그 상태를 업데이트 하는 함수이다.
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click
</button>
</div>
);
}
useEffect는 React의 함수형 컴포넌트에서 부수 효과(side effects)를 수행하기 위한 Hook이다. 클래스 컴포넌트의 생명주기 메소드인 componentDidMount, componentDidUpdate, componentWillUnmount에 해당하는 기능을 함수형 컴포넌트에서 구현할 수 있게 해준다. useEffect를 사용하면 데이터 fetching, 구독 설정 및 해제, 수동으로 DOM 조작하는 등의 작업을 수행할 수 있다.
useEffect는 두 개의 인자를 받는다. 실행할 부수 효과 함수와, 해당 효과의 실행이 의존하는 값들의 배열(의존성 배열)이다. 의존성 배열은 선택적으로 제공할 수 있으며, 제공하지 않을 경우 컴포넌트가 렌더링될 때마다 부수 효과가 실행된다.
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// 컴포넌트가 렌더링될 때마다 실행된다.
useEffect(() => {
// 문서 제목을 업데이트 한다.
document.title = `You Clicked ${count} times`;
// count가 의존성 배열이 되고 count가 바뀔 때만 이 효과를 재실행한다.
}, [count]);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click
</button>
</div>
);
}
useEffect에서 반환할 수 있는 클린업 함수는 컴포넌트가 언마운트되기 전이나, 다음 부수 효과가 실행되기 전에 필요한 정리(clean-up) 작업을 수행할 때 사용된다. 주로 이벤트 리스너의 제거, 타이머의 취소, 구독 해제 등에 사용된다.
useEffect(() => {
const subscription = dataSource.subscribe();
return () => {
// 클린업 함수에서 구독을 해제한다.
subscription.unsubscribe();
};
}, [dataSource]);
useRef는 React의 함수형 컴포넌트에서 ref를 생성하고 접근하기 위한 Hook이다. useRef는 DOM 요소나 컴포넌트 인스턴스에 직접적으로 접근할 필요가 있을 때 유용하게 사용된다. useRef는 변경 가능한 .current 속성을 가진 객체를 반환하며, 이 객체는 컴포넌트의 전체 생명 주기 동안 유지된다.
useRef를 사용하여 ref 객체를 생성하고, 이 객체를 원하는 DOM 요소의 ref 속성에 할당함으로써 해당 DOM 요소에 접근할 수 있다. 생성된 ref 객체의 .current 속성은 할당된 DOM 요소를 직접 가리킨다.
import React, { useRef } from 'react';
function TextInputWithFocusButton() {
const inputEl = useRef(null); // ref 객체 생성
const onButtonClick = () => {
// 현재 ref가 가리키는 DOM 요소에 직접 접근
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>
);
}
useRef는 React에서 제공하는 다양한 Hook 중 하나로, 특히 DOM 요소에 직접 접근이 필요한 상황이나, 렌더링 사이에 데이터를 유지해야 하는 경우에 매우 유용하게 사용될 수 있다.