Posts [React] 회원가입 폼 validation 디자인 구현하기
Post
Cancel

[React] 회원가입 폼 validation 디자인 구현하기


React - 회원가입 폼 validation 디자인 구현하기


  • 목적 : 핸들러를 구현하여 회원가입 양식에 어긋나는 입력을 할 시, UI에서 텍스트 필드가 오류 색상으로 변경되는 효과를 구현합니다.

  • 본 소스에는 Material-UI 를 사용하였습니다.

기능을 적용할 페이지의 함수 내부에 넣으면 됩니다.

  • hasNotSameError : 비밀번호와 비밀번호 확인 칸에 입력된 값이 다른지 판단하기 위함. true 혹은 false를 리턴하도록 작성
  • return 문에 들어가는 UI 요소들 중, TextField 항목의 “비밀번호”와 “비밀번호 확인” 칸에 대해 수정작업을 합니다.
  • TextField 속성에 error = {핸들러이름(인자)} 를 추가하면 해당 텍스트 필드에 에러 조건을 만족 시 오류 색상으로 변합니다.
  • 여기에 추가로 helperText 속성을 추가하면, 오류 발생 시에만 안내 문구가 텍스트필드 하단에 표시되도록 할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
...
function RegisterPage(props) {

    const dispatch = useDispatch();

    // props , state -> 이 안에서는 state 를 변화시켜서 이 안의 데이터를 변화시킬 수 있음
    // 입력한 이메일과 비밀번호를 서버에 넘길 수 있도록 state 에서 받고 있음
    const [Email, setEmail] = useState("")
    const [Password, setPassword] = useState("")
    const [Name, setName] = useState("")
    const [confirmPassword, setconfirmPassword] = useState("")

    const onEmailHandler = (event) => {
        setEmail(event.currentTarget.value)
    }

    const onPasswordHandler = (event) => {
        setPassword(event.currentTarget.value)
    }

    const onNameHandler = (event) => {
        setName(event.currentTarget.value)
    }

    const onconfirmPasswordHandler = (event) => {
        setconfirmPassword(event.currentTarget.value)
    }

    const hasError = passwordEntered =>
        Password.length < 5 ? true : false;
    
    const hasNotSameError = passwordEntered =>
        Password != confirmPassword ? true : false;    

    const onSubmitHandler = (event) => {
        event.preventDefault(); // 아무 동작 안하고 버튼만 눌러도 리프레쉬 되는 것을 막는다

        if(Password !== confirmPassword){
            return alert('비밀번호와 비밀번호 확인은 같아야 합니다.')
        }

        let body = {
            email: Email,
            password: Password,
            name: Name,
        }
        dispatch(registerUser(body))
            .then(response =>{
                if(response.payload.success){
                    alert('회원가입이 완료되었습니다!');
                    props.history.push('/login') // react 에서의 페이지 이동 코드
                } else{
                    alert('Error!!');
                }
            })
        // 완료가 잘 되었을 경우 이동
    }

    const classes = useStyles();

    return (
            <Container component="main" maxWidth="xs">
              <CssBaseline />
              <div className={classes.paper}>
                <Avatar className={classes.avatar}>
                  <LockOutlinedIcon />
                </Avatar>
                <Typography component="h1" variant="h5">
                  Messenger Sign Up
                </Typography>
                <form className={classes.form} noValidate onSubmit={onSubmitHandler}>
                    <Grid item xs={12}>
                      <TextField
                        autoComplete="fname"
                        name="firstName"
                        variant="filled"
                        value={Name}
                        onChange={onNameHandler}
                        required
                        fullWidth
                        id="firstName"
                        label="이름"
                        autoFocus
                      />
                    </Grid>
                    <Grid item xs={12}>
                      <TextField
                         variant="filled"
                        required
                        fullWidth
                        value={Email}
                        onChange={onEmailHandler}
                        id="email"
                        label="Email Address"
                        name="email"
                        autoComplete="email"
                      />
                    </Grid>
                    <Grid item xs={12}>
                      <TextField
                        variant="filled"
                        required
                        fullWidth
                        value={Password}
                        onChange={onPasswordHandler}
                        name="password"
                        error={hasError('password')} // 해당 텍스트필드에 error 핸들러 추가
                        label="Password(5글자 이상 필수)"
                        type="password"
                        id="password"
                        autoComplete="current-password"
                      />
                    </Grid>
                    <Grid item xs={12}>
                      <TextField
                        variant="filled"
                        required
                        fullWidth
                        value={confirmPassword}
                        onChange={onconfirmPasswordHandler}
                        name="confirmPassword"
                        error={hasNotSameError('confirmPassword')} // 해당 텍스트필드에 error 핸들러 추가
                        helperText={
                            hasNotSameError('confirmPassword') ? "입력한 비밀번호와 일치하지 않습니다." : null
                        } // 에러일 경우에만 안내 문구 표시
                        label="Confirm Password"
                        type="password"
                        id="confirmPassword"
                        autoComplete="current-password"
                      />
                    </Grid>
                  <Button
                    type="submit"
                    fullWidth
                    variant="contained"
                    onSubmit={onSubmitHandler}
                    color="primary"
                    className={classes.submit}
                  >
                    회원가입
                  </Button>
                  <Grid container justify="flex-end">
                    <Grid item>
                      <Link href="/login" variant="body2">
                        이미 가입하셨다면, 로그인해 주세요!
                      </Link>
                    </Grid>
                  </Grid>
                </form>
              </div>
              <Box mt={5}>
                
              </Box>
            </Container>
    )
}

다음은 에러 핸들러 처리가 되어, UI 요소에 오류 색상이 정상적으로 표시되는 모습입니다.

아무것도 입력하지 않을 시, 5글자 이하이므로 Password를 입력하는 텍스트 필드가 에러를 표시


5글자 이상 입력하면, 에러 색상이 사라지는 모습


Password와 다른 값 입력 시, Confirm Password 텍스트 필드가 오류를 표시하고 helperText도 표시되는 모습


조건에 맞도록 모두 입력 시 오류를 표시하지 않는 모습


[알고리즘 트레이닝] 4장 - 정렬과 탐색 및 스케줄링(스윕라인, 이벤트, 데드라인)

알고리즘 - C++의 set 정렬 기준을 임의로 바꾸기 & 백준 단어정렬