function useCounter(initialCount = 0) {
const [count, setCount] = useState(initialCount);
const increment = () => setCount(c => c + 1);
const decrement = () => setCount(c => c - 1);
return { count, increment, decrement };
}
function CounterA() {
const { count, increment } = useCounter(0);
return <button onClick={increment}>A: {count}</button>;
}
function CounterB() {
const { count, increment } = useCounter(10);
return <button onClick={increment}>B: {count}</button>;
}
여기서 CounterA와 CounterB는 동일한 useCounter 훅을 사용하지만, 각각의 상태와 로직은 완전히 독립적임
CounterA의 버튼을 클릭해도 CounterB의 카운트에는 영향을 주지 않음
이러한 독립성 덕분에 커스텀 훅은 다양한 상황에서 재사용 될 수 있음
다른 초기값으로 시작하는 여러 카운터,
증가/감소 로직이 필요한 다양한 UI 요소 (예: 수량 선택기, 페이지네이션 등),
카운트 기반의 애니메이션이나 타이머 등
UseInputCustomHook
import { useState } from "react";
function UseInputCustomHook() {
const [inputValue, setInputValue] = useState("");
const handleChange = (e) => {
setInputValue(e.target.value);
};
const handleSubmit = () => {
alert(inputValue);
setInputValue("");
};
return (
<div>
<h1> useInput</h1>
<input value={inputValue} onChange={handleChange}></input>
<button>확인</button>
</div>
);
}
export default UseInputCustomHook;
useInput.js
UseInputCustomHook.js 코드 수정
구현 화면
UseInputCustomHook
useInput
구현 화면
커스텀 훅이 가지고 있는 state와 effect는 커스텀 훅을 사용하는 컴포넌트마다 독립적임
한 컴포넌트에 독립적인 Hook을 여러번 사용해도 독립적인 state와 effect가 여러개 생성이 됨
위의 실습에서도 input을 반복해서 사용해도 각 input이 독립적인 state를 가짐