리액트의 기본 제공 훅(Hook)을 사용자가 자신의 요구에 맞게 만든 사용자 정의 훅을 의미합니다.
즉, 반복되는 로직을 리액트 내장 훅 들을 사용하여 구현한 '내가 만든(커스텀한) 훅'이다.
보통 Input과 Fetch를 관리할 때 주로 사용된다.
코드 재사용성 향상: Custom Hook을 사용하면 상태 관리나 사이드 이펙트 관리 같은 로직을 여러 컴포넌트에서 쉽게 재사용할 수 있습니다. 이는 코드 중복을 줄이고 프로젝트의 유지보수성을 높여줍니다.
컴포넌트 간소화: 복잡한 로직을 컴포넌트 밖으로 분리함으로써, 컴포넌트 자체는 더 간결하고 명확해집니다. 이는 컴포넌트의 가독성과 관리 용이성을 높여줍니다.
사용자 정의 로직의 모듈화: useState
, useEffect
, useContext
같은 리액트의 내장 훅을 조합하여 만들 수 있다. Custom Hook을 통해 특정 동작이나 로직을 모듈화하여, 애플리케이션 전반에 걸쳐 일관된 방식으로 기능을 제공할 수 있습니다.
커스텀 훅의 이름은 "use"로 시작해야 한다. ex)useFetchData, useCounter
훅(hook)은 함수의 최상위 레벨에서만 호출해야 한다: 훅은 반복문, 조건문, 중첩된 함수 내부에서 호출하면 안된다. 이 규칙을 지키면 훅의 호출 순서가 보장되어 훅의 내부 상태가 올바르게 유지된다.
훅(hook)은 리액트 함수 컴포넌트 내에서만 호출되어야 한다: 훅은 리액트의 함수 컴포넌트 또는 다른 훅 내부에서만 호출될 수 있다. 일반 JavaScript 함수에서 훅을 호출하면 안된다.
import { useState } from 'react';
// 커스텀 훅 정의
function useCounter(initialValue = 0) {
const [count, setCount] = useState(initialValue);
// count를 증가시키는 함수
function increment() {
setCount(count + 1);
}
// count를 감소시키는 함수
function decrement() {
setCount(count - 1);
}
// count를 리셋하는 함수
function reset() {
setCount(initialValue);
}
// 현재 count와 관련된 값을 반환하는 함수
function getCount() {
return count;
}
return {
count,
increment,
decrement,
reset,
getCount,
};
}
// 커스텀 훅 사용 예제
function Counter() {
const counter = useCounter(0);
return (
<div>
<p>Count: {counter.count}</p>
<button onClick={counter.increment}>증가</button>
<button onClick={counter.decrement}>감소</button>
<button onClick={counter.reset}>리셋</button>
</div>
);
}
export default Counter;
- custom hook인 useCounter내에서 usestate(내장훅)을 사용하여 로직을 더욱 강력하게 만들어주었다.
- useCounter는 재사용 가능하며, 다양한 컴포넌트에서 간단하게 카운터 기능을 사용할 수 있다.
function useFormInput(initialValue) {
const [value, setValue] = useState(initialValue);
const handleChange = (event) => {
setValue(event.target.value);
};
return {
value,
onChange: handleChange,
};
}
입력 관리 및 유효성 검사 로직을 별도의 훅으로 분리.
각 입력 필드 (id, pw, nickname, phone)의 값과 변경 이벤트를 처리하는 로직을 공통적으로 사용하는 custom hook(useFormInput)을 정의.
function useValidation(value, rules) {
const [isValid, setIsValid] = useState(true);
useEffect(() => {
setIsValid(rules.every(rule => rule.test(value)));
}, [value, rules]);
return isValid;
}
입력 값에 대한 유효성 검사 로직을 custom hook으로 분리.
이 훅은 입력 값과 유효성 검사 규칙을 받아 들여, 해당 입력이 유효한지 여부를 반환.
custom hook을 직접 과제에 적용해보며 컴포넌트를 더욱 유연하고, 재사용 가능하며, 관리도 용이하게 해주는 장점을 직접 느낄 수 있었다. 커스텀 훅을 적극 활용해보면 효과적인 컴포넌트 아키텍처를 구성해보자!
커스텀훅을 사용하는 이유를 꼼꼼하게 적어주셔서 명확하게 이해할 수 있었습니다. 또, custom Hook을 사용할 때 필요한 주의사항까지 정리되어 있어 다시 한 번 보고 공부했습니다.
빌트인훅을 사용하여 예제를 작성해주셔서 'custom hook에서 빌트인훅도 사용가능하다' 라는 사실도 생각할 수 있어서 좋았습니다. 과제에 직접 적용해주셔서 실제로 어떻게 써야하는 지 와닿았습니다 :)
이번 주도 좋은 아티클 감사합니다!
커스텀 훅에 전반적인 사용 이유, 네이밍 규칙, 주의사항등을 다시 한번 훑어보며 확인해볼 수 있어 좋았습니다! 예시 코드의 useCounter와 같이 재사용성이 높은 커스텀 훅을 만들기 위해서 더 노력해야할 것 같아요! 아티클 작성하시느라 고생하셨습니다!
커스텀 훅을 사용하는 이유와 주의사항 등을 자세하고 깔끔하게 정리해 주셔서 커스텀 훅의 특징을 확실하게 알아갈 수 있는 아티클인 것 같네요...🔥 커스텀 훅으로 재사용성을 증가시킨다는 것은 알고 있었지만 준혁님이 언급해 주신 것처럼 '보통 Input과 Fetch를 관리할 때 주로 사용된다'는 것은 잘 모르고 있었는데... 잊지 않겠습니다!! 과제에 적용한 예제까지 있어서 훨씬 이해가 잘 되는 아티클이었던 것 같아요!! 부끄럽지만 다른 사람이 만든 커스텀 훅을 사용하기만 하고 한 번도 작성해본 적이 없는데... 꼭 건휘 님의 아티클을 참고해서 만들어보도록 하겠습니다!! 깔끔하고 자세한 아티클 감사해요~~
커스텀 훅에 대한 개념설명과 예시 코드까지 작성해주셔서 잘 이해하고 갑니다 👍👍
모호하게 알고있던 개념이였는데, 간단하고 직관적인 예시인 useCounter 훅을 통한 커스텀훅의 재사용성 이점을 확실하게 집어주신 점이 너무 좋았어요!
또, 과제에서 직접 적용하신 부분도 인상깊었습니다. 저도 해당 유효성 검사 과정에서 중복되는 코드 처리에서 고민이 있었는데, 건휘님께서 너무 깔끔하게 처리해주셔서 커스텀 훅의 이점을 확실하게 깨닫고 갑니다 ㅎㅎ
좋은 글 감사합니다!
커스텀 훅의 정의부터 사용하는 이유, 네이밍 규칙까지 단계별로 정리되어 있어서 이해하기에 수월했습니다. 그리고 간단한 예제와 과제에서 디벨롭해서 만든 커스텀 훅까지 두 가지 다른 기능을 하는 커스텀 훅 실습 코드를 보면서 커스텀 훅이 어떤 경우에 쓰이는지 더 잘 알 수 있게 된 것 같아요! 앞으로 커스텀 훅 구현하기 전에 보러 오겠습니다 유용한 아티클 감사해요~!
건휘님 아티클을 읽고 커스텀 훅에 대해 더 자세히 알게 되었습니다!! custom Hook 사용시 주의사항 부분이 인상깊었는데, 훅은 함수의 최상위 레벨에서만 호출해야 하고, 리액트 함수 컴포넌트 내에서만 사용해야 한다는 점, 그리고 이러한 규칙을 지키지 않으면 훅의 호출 순서가 보장되지 않아 내부 상태 유지가 올바르게 이루어지지 않는다는 점을 다시 한번 더 알게 되었습니다! 마지막으로, custom Hook 코드 예시와 과제 적용 실습 부분도 인상깊었어요! useCounter와 useFormInput 같은 custom Hook을 직접 정의하고 사용하는 과정을 통해, 컴포넌트를 더 유연하고 재사용 가능하게 만드는 방법을 자세하게 알게 되었습니다! 좋은 아티클 감사합니다!!
커스텀 훅이 '보통 Input과 Fetch를 관리할 때 주로 사용된다.' 라는 것 까지는 놓치고 있었는데, 덕분에 한번 더 리마인드 하고 갑니다 ! 커스텀 훅 사용하는 이유, 네이밍 방식, 그리고 직접 사용해보는 예시들 덕분에 더욱 확실히 Custom Hook에 대해 이해할 수 있었던 것 같아요! 아티클 작성 고생하셨습니다 😊