React에서 Hooks는 함수형 컴포넌트에서 상태 관리와 생명주기 기능을 사용할 수 있도록 도와준다. 하지만 사용 시 몇 가지 중요한 규칙을 반드시 지켜야 한다. 아래는 흔히 발생하는 오류와 함께 기본 규칙, 그리고 Custom Hook을 활용한 코드 리팩토링 예제를 정리한 것이다.
Hooks는 컴포넌트 함수의 최상위에서만 호출해야 하며, 함수 외부에서 직접 호출하면 에러가 발생한다.
import { useState } from "react";
const [state, setState] = useState(); // ❌ 컴포넌트 함수 바깥에서 사용
const HookExam = () => {
return <div>hookexam</div>;
};
export default HookExam;
import { useState } from "react";
const HookExam = () => {
const [state, setState] = useState();
return <div>hookexam</div>;
};
export default HookExam;
Hooks는 항상 컴포넌트가 렌더링될 때 동일한 순서로 호출되어야 한다. 조건문, 반복문, 중첩 함수 안에 있으면 실행 순서가 달라져 버그가 발생할 수 있다.
import { useState } from "react";
const HookExam = () => {
if (true) {
const state = useState(); // ❌ 조건문 안에서 호출
}
for (let i = 0; i < 5; i++) {
const state = useState(); // ❌ 반복문 안에서 호출
}
return <div>hookexam</div>;
};
export default HookExam;
import { useState } from "react";
const HookExam = () => {
const [state, setState] = useState();
return <div>hookexam</div>;
};
export default HookExam;
여러 input 값을 관리하는 경우, useState와 onChange를 반복적으로 작성하게 된다. 이 때는 Custom Hook으로 로직을 분리하면 훨씬 깔끔해진다.
import { useState } from "react";
const HookExam = () => {
const [input, setInput] = useState("");
const [input2, setInput2] = useState("");
const onChange = (e) => {
setInput(e.target.value);
};
const onChange2 = (e) => {
setInput2(e.target.value);
};
return (
<div>
<input value={input} onChange={onChange} />
<input value={input2} onChange={onChange2} />
</div>
);
};
export default HookExam;
import { useState } from "react";
function useInput() {
const [input, setInput] = useState("");
const onChange = (e) => {
setInput(e.target.value);
};
return [input, onChange];
}
export default useInput;
import useInput from "../hooks/useInput";
const HookExam = () => {
const [input, onChange] = useInput();
const [input2, onChange2] = useInput();
return (
<div>
<input value={input} onChange={onChange} />
<input value={input2} onChange={onChange2} />
</div>
);
};
export default HookExam;
♻️ 리액트 컴포넌트 생명 주기(Lifecycle) 핵심 정리 (0) | 2025.06.03 |
---|---|
React - 상태 끌어올리기(State Lifting) (0) | 2025.06.01 |
React - Hooks (1) | 2025.06.01 |
React - useRef (0) | 2025.06.01 |
React - State로 입력 관리하기 (0) | 2025.06.01 |