FrontEnd Dev/react

[react]유효성 검사 (form validation)

몽쯔 2022. 5. 13. 17:31

회원가입등 기본 유효성 검사 기본 틀 

import {useState, useEffect} form 'react';
import {useHistory} from 'react-router-dom';

useState : 상태관리 hook

useEffect : state 변경시 반영 hook

useHistory : 페이지 이동 hook

 

function Join(){
// 유효성검사를 통과하면 이동할 history hook을 변수에 지정
 const history = useHistory();
 // input에서 입력받은 값을 객체에 저장
 const initval ={
  userid:'',
  pwd:'',
  check:null
 }
 
 // 상태 지정
 const [val, setVal] = useState(initVal); // value를 initval객체 넣는 state
 const [err, setErr] = useState({}); // 유효성에서 통과를 못할 경우 해당 문구를 담을 state
 const [isSubmit,setIsSubmit] = useState(fasle); // 유효성의 통과여부를 담는 state
 
 // 유효성 검사 통과 여부를 결정지을 함수
 const validation = (val) => {
  // 에러가 나면 문구를 담을 객체 생성
  const errs = {};

 // userid의 value가 5글자 미만이면 오류를 errs객체 userid라는 key값으로 담기
  if (val.userid.length < 5) {
   errs.userid = 'id를 5글자 이상 입력하세요';
  }
  return errs;
 };

// input 요소에서 값이 바뀌면 실행될 함수
 const handleChange = (e) => {
  // 구조분해할당을 통해 e.target의 가져올 객체 값 저장
  const { name, value } = e.target;
  
  // setVal에 값을 저장, 전개연산자를 이용해 바꾸지 않을 값들을 깊은 복사
  setVal({ ...val, [name]: value });
  };
  
  // 폼데이터 전송 시 실행할 함수
  const handelSubmit = (e)=>{
   // 기본 이동 막기
   e.preventDefault();
   
   // check함수에서 유효성 검사를 거쳐 반환된 객체를 setErr 객체에 전달
   setErr(check(validation));
  };
  
   useEffect(()=>{
   // err의 값이 변경되면 객체에 담긴 개수 세기
    const len = Object.keys(err).length;
    
    // err의 객체에 값이 0개이고 isSubmit이 참이면 경로이동
    if(len === 0 && isSubmit) {
     // 메인으로 페이지 이동
     history.push('/');
    }
   },[err]);
}
return (
 <>
 // submit 전송시 실행될 함수
  <form onSubmit={handleSubmit}>
   // 객체 value값을 담으려면 항상 onChange를 써줘서 값이 변화할때마다 이벤트를 담아주고 그 값을 value로 받아와야한다. 
   <input type='text' id='userid' name='userid' value={val.userid} onChange={(e)=> handleChange(e)}>
   // err가 나면 err문구 출력
   <div className='err'>{err.userid}</div>
   
   // 버튼 클릭시 submit에 전송하겠다는 state값을 변경 -> form에서 handleSubmit으로 유효성 검사 실행되는것
   <input type='submit' vlaue='JOIN' onClick={()=>setIsSubmit(true)}>
  </form>
 </>
)