목차 3번
more than 심화...
자 이제 마지막으로 좀 더 심화과정으로 회원가입을 구현해보도록 하자..!
이번에 우리가 추가로 구현할 것은 정규식을 통한 폼체크를 회원가입 기능에 넣을 것입니다.
아래는 구현된 코드의 모습이다.
import React,{useState,useEffect} from 'react'
const useInput = (defaultValue) => {
const [value,setValue] = useState(defaultValue)
const onChange = e => {
setValue(e.target.value)
}
return{
value,
onChange,
}
}
const validate = (input) => {
const {userid,password} = input
const errors = {}
if(userid === ''){
errors.userid="이메일이 입력되지 않았습니다."
} else if(!/^[a-z0-9%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i.test(userid)){
errors.userid = "입력된 이메일이 유효하지 않습니다."
}
if(!password){
errors.password="비밀번호가 입력되지 않았습니다."
} else if(password.length < 8){
errors.password = "8자 이상의 패스워드를 사용해야 합니다."
}
return errors
}
const Form = () => {
const id = useInput('')
const pw = useInput('')
const [submit,setSubmit] = useState(false) // 1번
const [errors,setErrors] = useState({})
const handleSubmit = e => {
e.preventDefault()
setSubmit(true)
// id.value
// pw.value
const input = {
userid:id.value,
password:pw.value
}
setErrors(validate(input))
}
useEffect(()=>{
if(submit){
if(Object.keys(errors).length === 0){
alert('회원가입이 완료되었습니다.')
}
setSubmit(false)
}
},[errors])
return(
<form onSubmit={handleSubmit}>
<h2>회원가입</h2>
<ul>
<li>
<label htmlFor="userid">아이디</label>
<input type='text' name="userid" {...id} />
{errors.userid && <span>{errors.userid}</span>}
</li>
<li>
<label htmlFor="password">패스워드</label>
<input type='password' name="password" {...pw} />
{errors.password && <span>{errors.password}</span>}
</li>
<li>
<input type='submit' value="가입" disabled={submit} />
</li>
</ul>
</form>
)
}
export default Form
1.
먼저 구조분해 할당을 통해서 useState를 통해 상태값을 설정하도록 하자. 우리가 만들 것은 가입버튼을 눌렀을 때의 상태값 변화와 error가 발생했을 때의 상태값 변화에 대해 설정을 줄 것이다. submit은 기본값을 false로 줬다.
const [submit,setSubmit] = useState(false)
const [errors,setErrors] = useState({})
2.
인제 이 친구들을 handleSubmit 함수 안에서 사용하도록 할 것이다.
const handleSubmit = e => {
e.preventDefault()
setSubmit(true)
// id.value
// pw.value
const input = {
userid:id.value,
password:pw.value
}
setErrors(validate(input))
}
가입버튼을 눌렀을 때 setSubmit(false)에서 true로 바꾸게 만들고,
input이라는 객체를 따로 만들어서 그 안에 userid와 password의 속성을 만들고 그 값을 id.value, pw.value로 설정을 해두었습니다. 우리는 이 input이라는 객체를 validate함수의 인자값으로 넣어서 보내줄 것입니다.
그렇다면 validate 함수가 무엇인지 알아보도록 하겠습니다.
3.
validate 함수 코드
const validate = (input) => {
const {userid,password} = input
const errors = {}
if(userid === ''){
errors.userid="이메일이 입력되지 않았습니다."
} else if(!/^[a-z0-9%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i.test(userid)){
// 정규표현식
// web7722@gamil.com
errors.userid = "입력된 이메일이 유효하지 않습니다."
}
if(!password){
errors.password="비밀번호가 입력되지 않았습니다."
} else if(password.length < 8){
errors.password = "8자 이상의 패스워드를 사용해야 합니다."
}
return errors
}
validate함수는 회원가입을 진행할 때 사용자가 회원가입 양식에 맞게 설정할 수 있도록 도와주는 함수이다 ( 폼체크 )
먼저 매개변수로 아까 우리가 setErrors(validate(input))을 통해 input 보내준 것을 매개변수로 사용한다.
input 객체의 속성이었던 userid, password를 가져와서 조건문으로 사용할 것이고, errors라는 새로운 변수를 만들어서 빈 객체로 둘 것이다.
조건문으로 userid가 빈 값일 때 변수 errors에 userid라는 속성을 만들고 그 값을 "이메일이 입력되지 않았습니다." 라는 string 값을 넣었다. 아래도 위와 같은 방식으로 코드를 진행했다. 정규식같은 경우는 아직 미숙하니.. 나중에 정리하는 걸로..
마지막으로 if문이 다 해당하지 않는다면 return 값으로 errors 만 내뱉는다.
4.
useEffect( )
useEffect(()=>{
if(submit){
console.log('회원거입 시켜줘')
// Object.keys(errors) // ['userid','password'].length // 2 , [].length // 0
if(Object.keys(errors).length === 0){
alert('회원가입이 완료되었습니다.')
}
setSubmit(false)
}
},[errors])
useEffect는 실행구조가 setTimeout과 비슷하다고 생각하면된다. -> 백그라운드로 보내짐.
조건문으로 시작을 하는데 submit이 true일 경우와 errors의 length가 0일 경우 ==> validate을 통해서 오류 문자열이 하나도 없을 경우 alert문으로 '회원가입이 완료되었습니다' 가 뜨게 하는 함수이다. 마지막으로 setSubmit을 통해 false 값으로 돌려준다.
그리고 useEffect(()=>{},[errors]) errors 배열이 들어감에 따라 componentDidUpdate가 발생이 된다. 그래서 버튼을 누를 때마다 계속 실행이 되면서 리렌더링이 되는 것을 알 수 있다.
5. 화면에 에러문구 설정한 것 뜨게하기
<li>
<label htmlFor="userid">아이디</label>
<input type='text' name="userid" {...id} />
{errors.userid && <span>{errors.userid}</span>}
</li>
<li>
<label htmlFor="password">패스워드</label>
<input type='password' name="password" {...pw} />
{errors.password && <span>{errors.password}</span>}
</li>
{errors.userid && <span>{errors.userid}</span>}
{errors.password && <span>{errors.password}</span>}
해당 코드는 errors.userid가 존재할 경우(&&) jsx문법을 통해서 나타나게 하는 코드이다. errors.password도 동일한 코드이다.
'React' 카테고리의 다른 글
react-router-dom (0) | 2022.05.03 |
---|---|
useCallback이 무엇일까?? (0) | 2022.05.03 |
React 기본적인 회원가입 구현하기 -2 (목차 2번 feat. custom Hooks 알아보기) (0) | 2022.04.26 |
React 기본적인 회원가입 구현하기 - 1(목차 1번 real 기본) (0) | 2022.04.26 |
React의 함수형 Component ( feat. Hooks ) (0) | 2022.04.25 |