안녕하세요! 오늘은 useState
를 사용하여 custom hooks를 만들어 사용하는 것을 정리해보려고 합니다. 저는 nomad coders
강의를 통해 공부하고 글을 정리해보았습니다.
아래 코드는 useState
를 사용하여 구현한 count 코드입니다. useState
를 사용하여 초기값을 0으로 지정하여 줍니다. 그리고 setCount
를 사용하여 값을 업데이트 하여 줍니다.
import { React, useState } from "react";
const Count = () => {
const [count, setCount] = useState(0);
const incrementCount = () => setCount(count + 1);
const decrementCount = () => setCount(count - 1);
return (
<div>
<h1>Current Count {count}</h1>
<button onClick={incrementCount}> up </button>
<button onClick={decrementCount}> down </button>
</div>
);
};
export default Count;
useState
를 기반으로 아래와 같이 useInput
hooks를 만들어 사용할 수 있는데요! useInput
을 사용하면 처리할 값에 길이 검증이나 특정 값의 포함여부에 따른 조건부 처리가 가능합니다.
export const useInput = (initValue) => {
const [value, setValue] = useState(initValue);
const onChange = (e) => {
const {
target: { value },
} = e;
setValue(value);
};
return { value, onChange };
};
아래 코드는 이름을 입력하는<input />
에 useInput
을 적용한 코드입니다.
import React from "react";
import { useInput } from "./hooks/customHooks";
const HooksStudy = () => {
const name = useInput("우든");
return (
<div>
<h1>useInput</h1>
<input placeholder="name" value={name.value}
onChange={name.onChange} />
</div>
);
};
export default HooksStudy;
추가적으로 <input />
props를 {}
를 사용하여 좀 더 간결하게 사용할 수 있어요!
const name=useInput("우든")
<input placeholder="name" {...name} />
또한,useInput
에 유효성 검증을 추가하여 사용할 수 있는데요!
아래 예시는 email을 입력받는 <input />
에 validate 기능을 추가하여 사용할 수 있어요!
먼저 아래와 같이 useInput
에 인자로 validator
을 추가하여 줍니다.
해당 validator type이 함수인지 검사한 후 에 함수가 맞다면 해당 함수의 리턴값을 willUpdate
변수에 저장하여 줍니다.
export const useInput = (initValue, validator) => {
const [value, setValue] = useState(initValue);
const onChange = (e) => {
const {
target: { value },
} = e;
let willUpdate = false;
if (typeof validator === "function") {
willUpdate = validator(value);
console.log(willUpdate);
}
if (willUpdate) {
setValue(value);
}
setValue(value);
};
return { value, onChange };
};
아래 화면은 validator 조건에 따른 값을 확인해본 화면입니다!
두번째는 useState
를 사용하여 다른 내용을 보여주는 useTabs
를 만들어보도록 하겠습니다.
const useTabs = (initTabIndex, allTabs) => {
const [currentIndex, setCurrentIndex] = useState(initTabIndex);
return {
currentItem: allTabs[currentIndex],
changeItem: setCurrentIndex,
};
};
만들어준 useTabs
를 적용해보도록 하겠습니다. 먼저 아래와 같이 데이터를 만들어 줍니다.
const allTabs = [
{
tab: "우든",
contents: "안녕하세요! 우든입니다.",
},
{
tab: "수봉",
contents: "안녕하세요! 수봉입니다.",
},
];
아래와 같이 적용하여 줍니다.
<h1>useTabs</h1>
<button onClick={() => changeItem(0)}>우든</button>
<button onClick={() => changeItem(1)}>수봉</button>
<p>{currentItem.contents}</p>
useState
를 사용하여 useInput
과 useTabs
hooks를 만들어 사용해봤는데요! 직접 만들어 사용해보니 어떤 구조를 가지고 있고 어떻게 동작하는지에 대해 이해할 수 있었습니다!