💻/[실습]
[React] Custom Hook : input 로직 분리하기
Mia_
2023. 1. 25. 13:22
Custom Hook : input 로직 분리하기
- [Hook] Custom Hook 예시 : 여러 input에 의한 상태 변경을 할 때 쓸 수 있는 useInputs
1. 파일 구조
.
├── public
│ └── index.html
├── src
│ ├── component
│ └── Input.js
│ └── util
│ └── useInput.js
│ ├── App.js
│ └── index.js
└── package.json
App.js
- Custom Hook useInput을 사용해서 받아오는 값 중 하나를 예시로 들어서 보면 firstForm은 커스텀 훅 안에 상태에서 받아온 e.target.value 값을 할당 받아있는 상태임.
- useInput의 리턴 값은 [form, onChange, reset] 이렇게 이루어져 있음
import { useState } from "react";
import useInput from "./util/useInput";
import Input from "./component/Input";
import "./styles.css";
export default function App() {
const [firstForm, firstNameValue, firstReset] = useInput("");
const [lastForm, lastNameValue, lastReset] = useInput("");
const [nameArr, setNameArr] = useState([]);
const handleSubmit = (e) => {
e.preventDefault();
setNameArr([...nameArr, `${firstForm} ${lastForm}`]);
firstReset();
lastReset();
};
return (
<div className="App">
<h1>Name List</h1>
<div className="name-form">
<form onSubmit={handleSubmit}>
<Input labelText={"성"} value={firstNameValue} />
<Input labelText={"이름"} value={lastNameValue} />
<button>제출</button>
</form>
</div>
<div className="name-list-wrap">
<div className="name-list">
{nameArr.map((el, idx) => {
return <p key={idx}>{el}</p>;
})}
</div>
</div>
</div>
);
}
component/Input.js
- App.js에서 부터 label 이름, value 값을 내려받음
function Input({ labelText, value }) {
return (
<div className="name-input">
<label>{labelText}</label>
<input {...value} type="text" />
</div>
);
}
export default Input;
util/useInput.js
- 리턴할 때 배열로 리턴함. 리턴하는 배열은 [form, onChange, reset]
- onChange는 상태를 e.target.value로 바꿔주는 함수 자체를 리턴함
- reset은 상태를 초기값으로 비워주는 함수 자체를 리턴함
import { useState } from "react";
function useInputs(initialForm) {
const [form, setForm] = useState(initialForm);
// change
const onChange = {
form,
onChange: (e) => {
setForm(e.target.value);
}
};
const reset = () => {
setForm(initialForm);
};
return [form, onChange, reset];
}
export default useInputs;
2. 실습한 예제