대표적인 React의 Hook으로는 useState
,useEffect
,useCallback
,useRef
, useMemo
등이 있다.
기존에는 컴포넌트 내에서 State와 생명주기를 관리하기 위해 반드시 클래스 컴포넌트(Class Componenet)를 사용해야 했지만 개발자가 느끼기에 다소 복잡한 점이 있어 이를 보완하고 함수 컴포넌트(Function Componenet)에서 클래스 컴포넌트의 기능을 구현하기 위해 React 16.8버전에 추가된 것이 Hook이다.
const App = () => {
const [state, setState] = useState(초기값)
}
const App = () => {
const [title, setTitle] = useState('')
setTitle('Hello') // state를 변경할 값을 직접 입력
// 또는
setTitle((current) => { // 현재 값을 매개변수로 받는 함수 선언
return current + 'React'; // return 값이 state에 반영됨
}
}
const App = () => {
useEffect(EffectCallback, Deps?)
}
Effect Hook을 사용하면 함수 컴포넌트에서 side effect를 수행할 수 있다.
컴포넌트가 최초로 렌더링될 때, 지정한 state나 prop이 변경될 때마다 이펙트 콜백 함수가 노출된다.
Deps : 변경을 감지할 변수들의 집합(배열)
EffectCallback : Deps에 지정된 변수가 변경될 때 실행할 함수
const App = () => {
const [count, setCount] = useState(0)
useEffect(()=>{
console.log(`버튼을 ${count}회 클릭했습니다.`
}, [count])
return (
<div>
<button onClick={() => setCount(count + 1)}>
클릭
</button>
</div>
)
}
count
state에 변경이 일어날 때마다 useEffect 함수부분이 실행된다.const App = () => {
useEffect(() => {
const interValid = setInterval(() => {
console.log("안녕하세요");
}, 1000);
return () => {
clearInterval(intervalid);
};
}, []);
};
const App = () => {
const [firstName, setFirstName] = useState("나나");
const [lastName, setLastName] = useSate("바");
const fullName = useMemo(() => {
return `${firstName} ${lastName}`;
}, [firstName, lastName]);
// 계산된 값을 메모이제이션하여 재렌더링 시 불필요한 연산을 줄인다.
};
const App = () => {
const [firstName, setFirstName] = useState("나나");
const [lastName, setLastName] = useSate("바");
const getFullName = useCallback(() => {
return `${firstName} ${lastName}`;
}, [firstName, lastName]);
return <>{getFullName()}</>;
};
const App = () => {
const inputRef = useRef(null);
const onButtonClick = () => {
inputRef.current.focus();
};
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={onButtonClick}>input으로 포커스</button>
</div>
);
};