새소식

React ·JS·TS

(React Hooks) useState - useInput

  • -

useInput -> input을 업데이트하는 hooks

 

const useInput = (initialValue) => {
  const [value, setValue] = useState(initialValue);
};

인자를 받아 상태의 초기값을 잡아준다.

 

 

 

export default function App() {
  const name = useInput("Mr.");
  return (
    <div className="App">
      <h1>Hello</h1>
      <input placeholder="Name" />
    </div>
  );
};

useInput 초기값으로 name("Mr.") 을 설정해준다.

 

 

 

  return { value};

useInput 에서 value 값을 리턴해준다.

 

 

 

      <input placeholder="Name" value={name.value} />
      <input placeholder="Name"  {...name} />

useInput에서 return해준 name값에 대입하여 가진 "Mr." 을 value에 기본값으로 부여 시켜준다.

{...name}을 사용하여 name이 가지고있는 모든요소를 풀어줄 수 도 있다.

 

 

 

 

  const onChange = event => {
    console.log(event.target)
  }
  return { value, onChange };

useInput에서 onChange 함수를 선언하여 value와 같이 return 해주면

      <input placeholder="Name" value={name.value} onChange={name.onChange} />

input tag에서 onChange 속성을 부여하여 사용이 가능하다.

위처럼 value와 onChange 두개를 다 선언하여 name.() 로 가져올 수 도 있지만

      <input placeholder="Name" {...name} />

으로 두개의 값을 한번에 가져올 수 도 있다

 

 

 

 

const useInput = (initialValue, validator) => {
  const [value, setValue] = useState(initialValue);
};

두 개의 인자를 받아 상태의 초기값과 유효성 검사를 한다.

 

 

 

 

  const onChange = (event) => {
    console.log(event.target);
    const {
      target: { value }
    } = event;
    let willUpdate = true;
    if (typeof validator === "function") {
      willUpdate = validator(value);
    }
    if (willUpdate) {
      setValue(value);
    }
  };

willUpdate 는 true로 선언되었으므로 항상 업데이트가 된다.

그러므로 validator의 타입이 function인지 검증하여 업데이트를 진행한다.

validator 가 function 이 아니라 다른 타입이 들어오면
validator(value) 이 부분에서 타입에러가 발생한다.

 

 

 

 

export default function App() {
  const maxLen = (value) => value.length < 10;
  const maxLen = (value) => !value.includes("@");
  const name = useInput("Mr.", maxLen);
  return (
    <div className="App">
      <h1>Hello</h1>
      <input placeholder="Name" /*value={name.value}*/ {...name} />
    </div>
  );
}

return받은 value값을 이용하여 제약조건을 거는 함수를 생성할 수 있다.

함수를 useInput에 담아서 input에 {...name}으로 풀어준다.

 

value.length < 10;    >>>     input의 value값이 10이 넘지 않도록 하기

!value.includes("@");     >>>    input의 value값에 @ 가 들어가지 않도록 하기

 

 

 

 

const useInput = (initialValue, validator) => {
  const [value, setValue] = useState.apply(initialValue);
  const onChange = (event) => {
    console.log(event.target);
    const {
      target: { value }
    } = event;
    let willUpdate = true;
    if (typeof validator === "function") {
      willUpdate = validator(value);
    }
    if (willUpdate) {
      setValue(value);
    }
  };
  return { value, onChange };
};

export default function App() {
  // const maxLen = (value) => value.length < 10;
  const maxLen = (value) => !value.includes("@");
  const name = useInput("Mr.", maxLen);
  return (
    <div className="App">
      <h1>Hello</h1>

      <input placeholder="Name" /*value={name.value}*/ {...name} />
    </div>
  );
}

전체코드

 

위와 같은 방법으로 작성시 다른 함수에서 이벤트를 처리 할 수 있다는 장점이 있다.

 

 

 

'React ·JS·TS' 카테고리의 다른 글

Lifecycle Methods(생명주기 메서드)  (1) 2023.10.16
(React Hooks) useEffect - useTitle / useClick  (1) 2023.10.16
(React Hooks) useEffect  (1) 2023.10.16
(React Hooks) useState - useTabs  (0) 2023.10.16
(React Hooks) useState  (0) 2023.10.16
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.