React에서 가장 좋은 장점은 컴포넌트 기반이기 때문에 재사용이 가능하다는 점입니다!
이번에 회원가입 서비스를 구현한 후 로그인 서비스 구현을 할려고 하니 이미 회원가입에서 만든 페이지를 재사용할 수 있겠다는 생각을 했습니다.
형식이 비슷해서 컴포넌트 재사용을 잘 활용해준다면 편리하게 개발할 수 있을 것 같습니다.
1. 부모 컴포넌트 만들기 - signup.js, signin.js
우선 url에 따라 사용될 로그인 컴포넌트와 회원가입 컴포넌트를 만들어줍니다.
import React from 'react';
import AuthForm from './AuthForm';
const Signup = () => {
return (
<div>
<AuthForm type='signup' />
</div>
);
};
export default Signup;
import React from 'react';
import AuthForm from './AuthForm';
const Signin = () => {
return (
<div>
<AuthForm type='signin' />
</div>
);
};
export default Signin;
여기에서 <AuthForm type=' ' />이 중요합니다.
type에 들어갈 것이 무엇인지에 따라 회원가입 페이지처럼 보여줄지 로그인 페이지처럼 보여줄지 결정할 것이기 때문입니다.
2. 자식 컴포넌트 만들기 - AuthForm.js
import axios from 'axios';
import React, { useEffect, useState } from 'react';
import './Sign.css'
const AuthForm = ({type}) => {
console.log(type)
...
return (
<div>
<div>
<h3>
{type === 'signup' ? '회원가입' : '로그인'}
</h3>
</div>
<div className='inputList'>
<input value={user.email} onChange={onChange} name='email' type="eamil" placeholder='이메일'></input>
<input value={user.password} onChange={onChange} name='password' type="password" placeholder='비밀번호'></input>
{type === 'signup' &&
<input value={user.passwordCheck} onChange={onChange} name='passwordCheck' type="password" placeholder='비밀번호 확인'></input>
}
{!isPassword && <span>비밀번호를 다시 입력해주세요</span>}
<button onClick={onClick} disabled={!(user.email && user.password && isPassword)}>가입하기</button>
</div>
</div>
);
};
export default AuthForm;
전체 코드는 이렇지만 자세하게 설명하기 위해서 부분별로 나누도록 하겠습니다.
2-1) 부모 컴포넌트로부터 데이터 받기
const AuthForm = ({type}) => {
console.log(type)
};
1번에서 signup에서 type='signin'으로 자식 컴포넌트에서 데이터를 보냈습니다.
그렇다면 console.log에는 무엇이 찍힐까요?
signin이 잘찍히네요.
반대로 signup으로 들어갔다면 콘솔에 signup이 찍힐 겁니다.
2-2) 조건부 렌더링
조건부 렌더링을 통해 타이틀을 회원가입 혹은 로그인이 나오게 해보겠습니다.
<h3>
{type === 'signup' ? '회원가입' : '로그인'}
</h3>
이처럼 type이 signup이라면 회원가입이 나오게, 아니라면 로그인이 나오게 해줬습니다.
이번에는 사용자들에게 입력값을 받는 input 창을 재사용해보도록 하겠습니다!
<div className='inputList'>
// 로그인의 경우 이메일과 비밀번호 input 밖에 보이지 않음
<input value={user.email} onChange={onChange} name='email' type="eamil" placeholder='이메일'></input>
<input value={user.password} onChange={onChange} name='password' type="password" placeholder='비밀번호'></input>
// 회원가입일 경우 비밀번호 확인 input이 추가
{type === 'signup' &&
<input value={user.passwordCheck} onChange={onChange} name='passwordCheck' type="password" placeholder='비밀번호 확인'></input>
}
...
</div>
공통적으로 사용하는 input은 2개입니다.
이메일과 비밀번호 input은 로그인과 회원가입 둘 다 필요하기 때문에 그대로 두고 회원가입일 때만 필요한 비밀번호 확인 input을 조건부 렌더링을 사용하여 추가해줍니다.
input에서 사용한 조건부 렌더링은 타이틀에서 사용한 조건부 렌더링과 다릅니다.
// 삼항연산자 패턴
{ isTrue ? 'yes!' : 'no!' }
// && 패턴
{ isTrue && 'yes!' }
{ isTrue ? 'yes!' : null } // 위와 같은 뜻
먼저 타이틀에서 사용한 것은 삼항연사자를 이용한 패턴입니다.
isTrue에서 True 값이 맞다면 yes라는 값이 보이고 아니라면 no라는 값이 나옵니다.
그에 비해 && 패턴은 (선행 조건) && (후행 조건)으로 앞에 있는 조건이 만족된다면 후행 조건이 반환됩니다.
그렇기 때문에 삼항연산자에서 아니라면 null이라는 값을 쓸때 && 패턴을 이용하는 것이 좋습니다.
짜잔 조건부 렌더링이 잘 되었다는 것을 알 수 있다.
다음에는 페이지 뿐만 아니라 서비스까지 재사용할 수 없는지 알아보도록 하겠습니다!
'Front Side > Library > React' 카테고리의 다른 글
[React] 웹 컴포넌트 스타일링 관리 styled components로 시작하기 (0) | 2023.01.06 |
---|---|
React에서 세션이 생성되지만 유지 되지 않는 Issue 해결 - withCredentials 옵션 (0) | 2022.10.17 |
[React] useState() 바로 반영 안되는 현상 해결 (0) | 2022.09.21 |
[React] useEffect 두 번 호출?! with.StrictMode (0) | 2022.08.21 |
[React] 리액트 이해하고 사용하기 (3) useEffect (0) | 2022.08.16 |
댓글