useInput
기본적으로 input을 업데이트 하는 Hook
const useInput = () => {};
import "./styles.css";
import { useState } from "react";
const useInput = (initialValue) => {
const [value, setValue] = useState(initialValue);
const onChange = (event) => {
console.log(event.target);
};
return { value, onChange };
};
export const App = () => {
const name = useInput("youngseo");
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<input placeholder="Name" {...name} />
</div>
);
};
export default App;
- useInput은 초깃값을 받아 state의 value값으로 설정하고 value 와 onChange 함수를 함께 객체로 리턴한다.
- {value, onChange} === {value:value, onChange:onChange}
- 다른 function에서 event를 처리할 수 있다는 점에서 react에게 있어 혁명적이다.
- react component가 아닌 useInput 함수에서 event를 처리한다.
- {...name} === value={name.value} onChange={name.onChange}
- 스프레드 연산자를 이용하면 긴 코드를 간결하게 표현할 수 있다.
useInput 유효성 검사
import "./styles.css";
import { useState } from "react";
const useInput = (initialValue, validator) => {
const [value, setValue] = useState(initialValue);
const onChange = (event) => {
const {
target: { value },
} = event;
let willUpdate = true;
if (typeof validator === "function") {
willUpdate = validator(value);
}
if (willUpdate) {
setValue(value);
}
};
return { value, onChange };
};
const App = () => {
const maxLen = (value) => value.length <= 10;
const name = useInput("youngseo", maxLen);
return (
<div className="App">
<h1>Hello</h1>
<input placeholder="Name" {...name} />
</div>
);
};
export default App;
- const { target: { value },} = event;
- event.target.value의 값을 value 라는 변수에 할당하는 것과 같다.
- 입력값이 10이하일 때는 값을 입력하면 onChange 함수가 실행되고, (이 때 onChange=name.onChange) event.target.value값이 validate 함수 (여기서는 maxLen) 의 파라미터로 들어가 유효성 검사를 한다.
- 이 때 유효성 검사의 boolean 값에 따라 setValue가 실행되어 value 값이 변경되고 상태가 바뀌어 다시 리렌더 되면서 새로운 value 값이 input 태그의 value 값으로 설정된다.
- 입력값이 10보다 커지면 willUpdate의 값이 false가 되어 setValue가 실행되지 않는다.
'스터디 > [노마드코더] 실전형 React Hooks' 카테고리의 다른 글
#5. useConfirm & usePreventLeave hook (0) | 2024.03.20 |
---|---|
#4. useClick hook (0) | 2024.03.20 |
#3. useTitle hook (0) | 2024.03.13 |
#2. useTabs hook (0) | 2024.03.13 |
#0. Introduction (0) | 2024.03.13 |