Java Script & Type Script
25. [React] 뼈갈넣 회원가입 유효성 검사
쩰라
2023. 1. 28. 14:00
728x90
export default function SignUp() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [confirmpassword, setConfirmpassword] = useState("");
const [username, setUserName] = useState("");
///유효성 검사 후 띄울 메세지
const [usernameMessage, setUsernameMessage] = useState("");
const [emailMessage, setEmailMessage] = useState("");
const [passwordMessage, setPasswordMessage] = useState("");
const [passwordConfirmMessage, setPasswordconfirmMessage] = useState("");
///유효성검사시에 이용할 useState 초기값
const [isUserName, setIsUserName] = useState(false);
const [isEmail, setIsEmail] = useState(false);
const [isPassword, setIsPassword] = useState(false);
const [isPasswordConfirm, setIsPasswordConfirm] = useState(false);
///1. 닉네임 유효성검사-2글자 이상 12자리 이하 특수문자불가
const onChangeName = useCallback((e) => {
const usenameRegex = /[^a-zA-Z0-9ㄱ-힣]/g;
setUserName(e.target.value);
if (usenameRegex.test(e.target.value)) {
setUsernameMessage("특수문자는 이용이 불가능합니다!");
setIsUserName(false);
} else if (e.target.value.length < 2) {
setUsernameMessage("2글자 이상 입력해주세요.");
setIsUserName(false);
} else if (e.target.value.length > 12) {
setUsernameMessage("12자리 이하로 입력해주세요");
setIsUserName(false);
} else {
setUsernameMessage("올바른 형식입니다.");
setIsUserName(true);
}
}, []);
//2. 이메일 유효성검사-알파벳과숫자,@포함필수
const onChangeEmail = useCallback((e) => {
///이메일정규식
const emailRegex =
/([\w-.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
const emailCurrent = e.target.value;
setEmail(emailCurrent);
if (!emailRegex.test(emailCurrent)) {
setEmailMessage("이메일형식을 확인해주세요!");
setIsEmail(false);
} else {
setIsEmail(true);
setEmailMessage("올바른 형식입니다.");
}
}, []);
///3. 패스워드 유효성검사-알파벳,숫자,특수문자 8자리이상 15자리 이하
const onChangePassword = useCallback((e) => {
///패스워드 정규식사용.
const passwordRegex =
/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,15}$/;
const passwordCurrent = e.target.value;
setPassword(passwordCurrent);
if (!passwordRegex.test(passwordCurrent)) {
setPasswordMessage(
"대문자+소문자+특수문자+숫자 조합으로 8~15자리로 입력해주세요!"
);
setIsPassword(false);
} else {
setPasswordMessage("올바른 형식입니다. ");
setIsPassword(true);
}
}, []);
///4. 비밀번호 재확인
const onChangePasswordConfirm = useCallback(
(e) => {
const passwordConfirmCurrent = e.target.value;
setConfirmpassword(passwordConfirmCurrent);
if (password === passwordConfirmCurrent) {
setPasswordconfirmMessage("올바르게 입력했습니다. ");
setIsPasswordConfirm(true);
} else {
setPasswordconfirmMessage(
"비밀번호가 일치하지 않습니다. 다시 확인해주세요."
);
setIsPasswordConfirm(false);
}
},
[password]
);
///버튼 클릭시 회원가입 submit
const onSubmit = useCallback(
async (e) => {
e.preventDefault();
try {
await axios({
method: "post",
url: "http://3.36.130.126/users/signup",
data: { username: username, email: email, password: password },
}).then((res) => {
console.log("response:", res);
if (res.status === 201) {
alert("회원가입이 완료되었습니다");
console.log("User profile", res.data.username, res.data.email);
window.location.replace("/");
}
});
} catch (err) {
console.error(err);
}
},
[email, username, password]
);
return (
<SwholeDiv>
<TopBar />
<SSignupForm onSubmit={onSubmit}>
<Simagelogo src={"img/logo-pink.png"} />
<SInput
autoFocus
required
onChange={onChangeName}
value={username}
placeholder="닉네임 2~12자리 입력(특수문자이용은 불가능합니다!)"
/>
{username.length > 0 && (
<Sspan className={`message ${isUserName ? "success" : "error"}`}>
{usernameMessage}
</Sspan>
)}
<SInput
required
onChange={onChangeEmail}
value={email}
placeholder="이메일 주소 입력"
/>
{email.length > 0 && (
<Sspan className={`message ${isEmail ? "success" : "error"}`}>
{emailMessage}
</Sspan>
)}
<SInput
type="password"
required
onChange={onChangePassword}
value={password}
placeholder="비밀번호 입력(대문자+소문자+특수문자+숫자 조합으로 8~15자리 입력해주세요!)"
/>
{password.length > 0 && (
<Sspan className={`message ${isPassword ? "success" : "error"}`}>
{passwordMessage}
</Sspan>
)}
<SInputbottom
type="password"
required
onChange={onChangePasswordConfirm}
value={confirmpassword}
placeholder="비밀번호 재확인"
/>
{confirmpassword.length > 0 && (
<Sspan
className={`message ${isPasswordConfirm ? "success" : "error"}`}
>
{passwordConfirmMessage}
</Sspan>
)}
<Sbutton
type="submit"
disabled={!(isUserName && isEmail && isPassword && isPasswordConfirm)}
>
회원가입
</Sbutton>
</SSignupForm>
<Copyright />
</SwholeDiv>
);
}
스타일드컴포넌트는 생략....
const SSignupForm = styled.form`
margin: 100px auto auto auto;
display: flex;
flex-direction: column;
/* border: 1px solid black; */
height: 400px;
width: 500px;
padding: 20px;
/* gap: 15px;/ */
`;
const SInput = styled.input`
border: 1px solid rgba(216, 216, 216);
height: 40px;
border-bottom: none;
padding-left: 15px;
`;
const SInputbottom = styled.input`
border: 1px solid rgba(216, 216, 216);
height: 40px;
padding-left: 15px;
`;
const Sspan = styled.span`
font-size: 15px;
`;
const Sbutton = styled.button`
margin-top: 20px;
border: none;
height: 40px;
color: white;
font-weight: 700;
background-color: rgba(215, 215, 215);
cursor: pointer;
`;
const SwholeDiv = styled.div`
background-color: rgba(249, 249, 249);
height: 100%;
width: auto;
`;
const Simagelogo = styled.img`
height: 50px;
width: 120px;
/* justify-content: center; */
/* align-items: center; */
display: flex;
margin: -70px auto 50px auto;
`;
하려다 언제 또 쓸지몰라.... 여기 붙였습니다
정규표현식
특수문자 체크 정규식
const regExp = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+<>@\#$%&\\\=\(\'\"]/g;
모든 공백 체크 정규식
const regExp = /\s/g;
숫자만 체크 정규식
const regExp = /[0-9]/g;
이메일 체크 정규식
const regExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i;
핸드폰번호 정규식
const regExp = /^\d{3}-\d{3,4}-\d{4}$/;
일반 전화번호 정규식
const regExp = /^\d{2,3}-\d{3,4}-\d{4}$/;
아이디나 비밀번호 정규식
const regExp = /^[a-z0-9_]{4,20}$/;
휴대폰번호 체크 정규식
const regExp = /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/;
728x90