REACT_HOOKS useInput 예제 (간단한 회원가입폼 만들기)

아.. 멀미가 난다... 그래도 구현한
input회원가입 폼 덩어리..

구현해야할 기능들

  • inputValue useInput으로 관리하기
  • submit 버튼 누르면 value초기화 되고 input value 담은 object App.js로 보내기
  • SignUp.jsx 에서 받은 데이터 배열에 넣기

엄청난 하드코딩으로 만들어진 첫 코드... 리팩토링 해서 많이 변형시킬꺼임.. 처음이라 개떡같은 코드임


useInput 이용해서 간단한 회원가입 만들기

1. UI구현

//SignUp.jsx

import "./SignUp.css";

const SignUp = () => {
  return (
    <div className="signUp">
      <form action="" autoComplete="off" >
        <div className="inputBox">
          <label htmlFor="id">Name</label>
          <input name="id" type="text"  />
        </div>
        <div className="inputBox">
          <label htmlFor="age">Age</label>
          <input type="text" name="age"  />
        </div>
        <div className="inputBox">
          <label htmlFor="gender">Gender</label>
          <input
            type="text"
            name="gender"     
          />
        </div>
        <div className="inputBox">
          <label htmlFor="phone">Phone</label>
          <input
            type="text"
            name="phone"         
          />
        </div>
        <div className="inputBox">
          <label htmlFor="email">Email</label>
          <input
            type="text"
            name="email"     
          />
        </div>
        <div className="inputBox">
          <label htmlFor="address">Address</label>
          <input
            type="text"
            name="address"
          />
        </div>
      </form>
      <button className=" btn" >
        Submit!
      </button>
    </div>
  );
};
export default SignUp;

구현된모습

2. useInput(custom Hook)이용해서 setState관리하기

import { useState } from "react";
import "./SignUp.css";

const SignUp = () => {
  const useInput = (initialValue) => {
    const [value, setValue] = useState(initialValue);
    const handler = (event) => {
      setValue(event.target.value);
    };
    return [value, handler];
  };
  return (
  <div className="signUp">
    ...생략
  )

코드의 역활은 initialValue를 받아 state의 초기값에 할당하고, onChange 함수를 만들어 value와 handler를 리턴시킨다.

3. useInput사용하기

import { useState } from "react";
import "./SignUp.css";

const SignUp = ({}) => {
  const useInput = (initialValue) => {
    const [value, setValue] = useState(initialValue);
    const handler = (event) => {
      setValue(event.target.value);
    };
    return [value, handler];
  };

  const [id, onChangeId] = useInput("");
  const [age, onChangeAge] = useInput("");
  const [gender, onChangeGender] = useInput("");
  const [phone, onChangePhone] = useInput("");
  const [email, onChangeEmail] = useInput("");
  const [address, onChangeAddress] = useInput("");

  return (
    <div className="signUp">
      <form action="" autoComplete="off" >
        <div className="inputBox">
          <label htmlFor="id">Name</label>
          <input name="id" type="text" value={id} onChange={onChangeId} />
        </div>
{...이하 생략}

useInput함수는 value와 handler를 return한다.
value : id ,
handler:onChangeId
함수가 된다.
[arrIndex[0],arrIndex[1] ... ]로 받아올 수 있는 이유는 ES6의 새로운 문법 비구조 할당 문법때문이다.
비구조 할당(구조분해) 문법

const array= [1,2,3]
[1,2,3] = array
const object={a:'1',b:'2'};
const {a,b}= object
// a=1 , b=2
const objectInObj={a:{one:'1'}};
const {a:{one}}= object
//one = 1

자세한 설명은 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment [모를땐 Mozilla]

아무튼!

[value,handler] = useInput()
[id,onChangeId] = useInput()
// id = value 할당, onChangeId= handler 할당

4. onSubmit함수로 App.js에 데이터 전달하기.

//App.js
import { useState } from "react";
import SignUp from "./components/SignUp";
import "./styles.css";
export default function App() {
  const [userData, setUserData] = useState([]);
  const addData = (data) => {
    setUserData([
      ...userData,
      {
        ...data,
        key: data.id
      }
    ]);
  };
  return (
    <div className="container">
      <SignUp onUpdate={addData} />
    </div>
  );
}
//SignUp.jsx
{...생략}
  const handleSubmit = (e) => {
    e.preventDefault();
    onUpdate({
      id,
      age,
      gender,
      phone,
      email,
      address
    });
    return (    <div className="signUp">
      <form action="" autoComplete="off" onSubmit={handleSubmit}>
      {...생략}
          </form>
      <button className=" btn" onClick={handleSubmit}>
        Submit!
      </button>
    </div>
    )

App.js

  1. 배열 state 생성 (SignUp.jsx의 inputValue 오브젝트를 가져와 복제할 빈배열 state)
  2. onUpdate 함수 생성
    -> 기존 배열 안 state 복사, data복사,key값 만들기

SignUp.jsx

1.onSubmit 함수 만들기
-> event 막기, onUpdate함수 받아와서 inputValue값 오브젝트 형식으로 props 전달하기

App.js에 있는 state로 값이 잘 전달됨. 근데 문제가있음^^;;
사실 무척많음 ^^;;

😢문제점...😢

✔ 처음 SignUp.jsx의 data가 안들어옴. (빈배열)

✔ submit 버튼을 눌렀을 때, value가 초기화가 안됨.(setState(''))

submit 눌러도 초기화가 안되는데, 하려면 useInput을 갈아 엎어야함.

✔ 유효성검사 코드도 넣어야 함

결론 : useInput 고치고 , input처음이 왜 안들어가는지 찾아야 함.


물론 내일 할꺼임😜😁🤣😎😃🐱‍🐉😆

좋은 웹페이지 즐겨찾기