티스토리 뷰

시큐리티 공부+적용과 동시에 리액트로 각 페이지들 UI를 구현하려고 합니다.

회원관리 페이지들부터 구현해보겠습니다!

 


 

회원가입 Register.js 컴포넌트 생성

  • pages 폴더 아래에 Register.js 컴포넌트 생성
  • css 폴더 아래에 Register.css 생성

 

💻 Register.js 초기 코드

import React from "react";
import '../css/Register.css';

class Register extends React.Component {
    render() {
        return (
            <h1>Register</h1>
        )
    }
}

export default Register;

 

 


 

 

💻 Register.js 폼 작성

 

Register.js

import React from "react";
import '../css/Register.css';
import Nav from "../components/Nav";

class Register extends React.Component {
    render() {
        return (
        <div>
            <div>
                <Nav/>
            </div>
          <form>
            <div>
            <h1 id='register_title'> 회원가입</h1>
            </div>
            <div className='register'>
            <div>
                {/* 아이디 */}
                <div>
                <h5> 아이디 </h5>
                <input type='text' class="input-field" maxLength='20' name='register_id' placeholder="7자 이상의 문자" autoFocus/>
                <button type="button" id="dupIdCheck">중복확인</button>
                </div>

                {/* 비밀번호 */}
                <div>
                <h5> 비밀번호 </h5>
                <input type='password' class="input-field" maxLength='15' name='register_password' placeholder="비밀번호"/>
                </div>

                {/* 비밀번호 */}
                <div>
                <h5> 비밀번호 확인 </h5>
                <input type='password' class="input-field" maxLength='15' name='register_pswCheck' placeholder="비밀번호 확인"/>
                </div>
            
                {/* 이름 */}
                <div>
                <h5> 이름 </h5>
                <input type='text' class="input-field" maxLength='10' name='register_name' placeholder="이름"/>
                </div>

                {/* 생년월일 */}
                <div>
                <h5> 생년월일 </h5>
                <input type='text' class="input-field2" maxLength='6' name='register_birthday'/> -&nbsp; 
                <input type='text' class="input-field3" maxLength='1' name='register_sex'/> ******
                </div>

                {/* 이메일 */}
                <div>
                <h5> 이메일 </h5>
                <input type='text' class="input-field2" maxLength='15' name='register_email'/> @&nbsp; 
                <select name='register_email_select'>
                    <option value='gmail.com'> gmail.com </option>
                    <option value='naver.com'> naver.com </option>
                    <option value='write'> 직접 입력 </option>
                </select>
                </div>

                {/* 주소 추가해야됨 */}
              </div>
            </div>

            <div>
            <button type="submit" id="sbtn">가입하기&nbsp;🎉</button>
            </div>
        </form>
      </div>

        )
    }
}

export default Register;

 

 

Register.css

* {
    box-sizing: border-box;
    font-family: 'SUIT-Medium';
}

div h5 {
    margin-bottom: 3px; 
    color: rgb(107, 107, 107);
}

div > div {
    margin-bottom: 3px; 
}

form {
    width: 600px;
    height: auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    border: 1px solid rgb(163, 156, 231);
    border-radius: 20px;
    padding: 20px;
    background-color: #ffffff;
}

.input-field {
    width: 70%;
    height: 30px;
    border: 1px solid rgb(163, 156, 231);
    border-radius: 5px;
    padding: 0 10px;
    margin-bottom: 10px;
}

.input-field2 {
    width: 40%;
    height: 30px;
    border: 1px solid rgb(163, 156, 231);
    border-radius: 5px;
    padding: 0 10px;
    margin-bottom: 10px;
}

.input-field3 {
    width: 8%;
    height: 30px;
    border: 1px solid rgb(163, 156, 231);
    border-radius: 5px;
    padding: 0 10px;
    margin-bottom: 10px;
}

#dupIdCheck {
    background-color: rgb(163, 156, 231);
    color: #f7f5f5;
    width: 80px;
    height: 30px;
    font-size: 13px;
    border: 1px solid rgb(89,117,196);
    border-radius: 5px;
    margin-left: 10px;
}

#register_title {
    text-align: center;
    color: rgb(163, 156, 231);
}

select {
    width: 50%;
    height: 30px;
    border: 1px solid rgb(163, 156, 231);
    border-radius: 5px;
    padding: 0 10px;
    margin-bottom: 10px;
}

button {
    width: 100%;
    height: 30px;
    background-color: rgb(163, 156, 231);
    color: #fff;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    margin-top: 10px;
}

.register {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

/* 가입하기 버튼 */
#sbtn {
    background-color: rgb(163, 156, 231);
    color : white;
    width: 400px;
    height:50px;
    font-size: 20px;
    font-weight: bold;
    border : none;
    border-radius: 5px;
    margin : 20px 0 50px 0;
}

 

 


 

 

💻 email '직접 입력' 부분 추가

gmail.com과 naver.com을 선택한 경우에는 콘솔창에 false가 찍히는 것을 확인할 수 있습니다.

 

[직접 입력] 을 선택한 경우에는 콘솔창에 true가 찍히며, 새로운 input창이 하나 생기는 것을 확인할 수 있습니다.


email 선택란의 옵션 중 [직접 입력] 을 선택하면 입력창이 뜨도록 구현해줄 것 입니다.

 

 

✔ 먼저, email_writer의 state 초기값을 false로 생성해주고

// email_writer의 state값을 false로 생성
    constructor(props) {
        super(props)  // 부모 클래스의 생성자 호출
        this.state = {   // 초기 상태 설정
            email_writer : false,   // email_writer라는 상태 속성을 가지며 초기값은 false
        }
    }

 

 

changeEmailSelect 이름의 함수를 생성해줍니다.

    if문을 사용해 선택된 값이 write 라면 email_writer 상태를 초기값 false에서 true로 업데이트 해줍니다.

    콘솔로 찍어서 확인해보는 콜백함수까지 작성해주었습니다. 확인 후에는 삭제해도 무방합니다.

// _changeEmailSelect 함수
    changeEmailSelect = (event) => {
        const select = event.target.value;   // 이벤트 객체에서 선택된 값을 가져옴

	// 만약 선택된 값이 'write' 라면 email_writer 상태를 true로 업데이트
        if (select === 'write') {
            this.setState({ email_writer: true }, () => {
                console.log("email_writer is now true:", this.state.email_writer);
            });
	// 선택된 값이 'write'가 아니라면 email_writer 상태를 false로 업데이트
        } else {
            this.setState({ email_writer: false }, () => {
                console.log("email_writer is now false:", this.state.email_writer);
            });
        }
    }

 

 

  changeEmailSelect 함수에서는 select 라는 변수의 값으로 ‘register_email_select’의 name값이 있는 태그의 값을 가져오게 됩니다.

사용자가 직접 입력 옵션을 선택했을 경우에는 'write' 라는 value 값을 가져올 수 있습니다.

{/* 이메일 */}
         <div>
                <h5> 이메일 </h5>
                <input type='text' className="input-field2" maxLength='15' name='register_email'/> @&nbsp; 
                <select name='register_email_select'>
                    <option value='gmail.com'> gmail.com </option>
                    <option value='naver.com'> naver.com </option>
                    <option value='write'> 직접 입력 </option>
                </select>
	</div>

 

 

 

 

여기까지 했다면

이제 onChange 이벤트를 작성해 사용자가 이메일 선택을 할 때 마다 위에 작성했던  changeEmailSelect 함수를 호출하고, 그 결과에 맞게 새로운 인풋창이 생기도록 설정해야합니다.

 

✔ onChange 이벤트

 

<select> 엘리먼트의 onChange 이벤트에 이벤트 핸들러 함수인 this.changeEmailSelect를 연결합니다. 이는 사용자가 선택을 변경할 때마다 changeEmailSelect 함수가 호출됩니다.

 

resiger_email_select name을 가지는 select 태그에

onChange 이벤트를 이용해서 changeEmailSelect 함수를 실행시켜준 후,

<select name='register_email_select' onChange={this.changeEmailSelect}>

 

’email_writer’ 의 값이 true일 때만 보여지는 input을 새로 추가해줍니다.

{this.state.email_writer ? <div> <input type='text' name='register_email_write' maxLength='20'/> </div>
                         : null}

 

 

이렇게 하면

맨 위에 화면 캡쳐 사진과 같이

[직접 입력] 을 선택했을 경우, 새로운 인풋창이 생겨나는 것을 확인할 수 있습니다!


💻  Register.css에 스타일 추가

이제 못생긴 인풋창에 스타일을 추가해보겠습니다.

 

input[name=register_email_write] {
    width: 50%;
    height: 30px;
    border: 1px solid rgb(163, 156, 231);
    border-radius: 5px;
    padding: 0 10px;
    margin-bottom: 10px;
    margin-left: 47%; 
}

 

'Project 댕린이집' 카테고리의 다른 글

[React] Register.js 아이디 중복 체크 구현  (0) 2024.02.07
[React] Login.js UI 구현  (0) 2024.02.06
API 명세서 작성하기  (0) 2024.02.01
API와 Endpoint  (0) 2024.01.31
[Spring security] SecurityFilterChain  (0) 2024.01.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/06   »
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
글 보관함