본문 바로가기
React/React Basic

[React] Ternary Operator | && | Single responsibility | 로그인, 사인업 플로우| Expression vs Statement | Conditional Rendering |

by CodeMia 2022. 3. 17.

로그인 플로우를 배워보자. 

 

 

 

유저가 로그인 했을 때는 Hello가 나오고, 

 

 

로그인 안했을 때는 로그인 form 박스가 나오도록 해보자. 

 

 


시작 코드

index.html 

<!DOCTYPE html>
<html lang="en">
<head>
<title>React App</title>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300"
/>
<link rel="stylesheet" href="styles.css" />
</head>

<body>
<div id="root"></div>
<script src="../src/index.js" type="text/jsx"></script>
</body>
</html>

 

 

 

styles.css

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  font-weight: 300;
}

body {
  font-family: "Source Sans Pro", sans-serif;
  color: white;
  font-weight: 300;
  background: #50a3a2;
  width: 100%;
  height: 100%;
}

.container {
  margin: 10% auto;
  padding: 80px 0;
  text-align: center;
}

.container h1 {
  font-size: 40px;
  font-weight: 200;
}

form {
  padding: 20px 0;
  position: relative;
}
form input {
  border: 1px solid rgba(252, 252, 252, 0.4);
  background-color: rgba(252, 252, 252, 0.2);
  width: 250px;
  border-radius: 3px;
  font-family: "Source Sans Pro", sans-serif;
  padding: 10px 15px;
  margin: 0 auto 10px auto;
  display: block;
  text-align: center;
  font-size: 18px;
  color: white;
  font-weight: 300;
}

form button {
  appearance: none;
  outline: 0;
  background-color: white;
  border: 0;
  padding: 10px 15px;
  color: #50a3a2;
  border-radius: 3px;
  width: 250px;
  font-size: 18px;
}

 

 

 

Index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/App';


ReactDOM.render(
  <div>
    <App />
    </div>,
    document.getElementById('root'));

 

 

App.js 

import React from "react";

function App() {
  return (
    <div className="container">
      <h1>Hello</h1>
      <form className="form">
        <input type="text" placeholder="Username" />
        <input type="password" placeholder="Password" />
        <button type="submit">Login</button>
      </form>
    </div>
  );
}

export default App;

 

 

 


 

 

 

유저가  맨 먼저 화면에 들어갔을 때는

로그인이 안되어 있는 상태이다. 

 

 

시작 화면으로 로그인 form 화면이 보이게 한다. 

 

 

 

isLoggedIn이라는 변수 하나를 만들고,

false로 설정해 준다. 

 

 

 

 

여기서 로그인이 안되어 있으면 

 isLoggedIn === false 

form으로 가게 하고 

 

 

 

 isLoggedIn === true; 

이면 <h1>Hello</h1>로 가게 한다. 

 

 

어떻게 해야할까?

이미 배운 내용을 활용하면

if statement가 들어간 함수를 만들어 아래처럼 쓸 수 있을 것이다. 

 

if (isLoggedIn === true)를 줄인 것이

if (isLoggedIn) 이다. 

 

 

 

isLoggedIn을 true로 바꿔주면  h1이 나오고, 

 

 

 

false인 경우 로그인 폼 화면이 나온다. 

 

 

 

하지만 이 코드는 너무 길다. 

좀 더 나은 방법이 있다. 

 

 


 

 

Single-responsibility Principle (SRP)란?

A class should have one and only one reason to change, meaning that a class should have only one job.

더보기 

 


 

form을 일단 컴포넌트로 뺀다.

각 컴포넌트는 single responsiblity를 가져야 한다. 

 

 

 

1. Login form을 컴포넌트로 만든다.

Login.jsx 파일을 만들고 안에 form을 넣은 함수를 만든다. 

Login.jsx

 

 

App.jsx 에서 Login 컴포넌트를 부른다. 

App.jsx

 

 

2. Login.jsx에서 input만 따로 떼서 또 컴포넌트로 만든다. 

Input.jsx 파일에 컴포넌트를 만든다. 

 

 

 

Login.jsx 파일에서 불러온다. 

 

 

 

3. App.jsx 코드를 정리하기 위해

renderConditionally() 함수를

{ } 안 익명 함수로 바로 넣어 코드를 짧게 만든다. 

App.jsx

 

 

하지만 함수를 집어넣으면 에러가 발생한다. 

 

 

이유는 renderConditionally() 함수가 statement이기 때문이다. 

jsx { }안에는 expression은 들어갈 수 있지만, 

statement는 들어갈 수 없다. 

 

 

그렇다면 어떻게 함수안에 if statement 함수를 집어 넣을 수 있을까? 

이런 경우 Ternary Operator를 쓸 수 있다. 

 

 

 


 

 

Conditional Rendering | Ternary Operator 

if statement를 expression으로 만들어 함수 안에 넣는다. 

 

 condition  ?   do if true do if false

ex) isCloudy===true ? bringUmbrella():bringSunscreen()

 

 

 

 

=== true를 없애 버리고 그냥 제목만 써줘도 된다.

간단한 코드는 아래처럼 나타낸다. 

 

 


 

시간에 따라 내용 바꿔보기 

do if false 는 내용이 없어서 null 이다. 

 


&& (AND Operator)

 

 

(Expression && Expression)

var x = 5; 로 정의하고

(x > 3 && x < 7)

x > 3 도 true 고

x < 7 도 true 니깐 전체를 true로 보고 

 

var x = 1;

(x > 3 && x < 7)

x > 3 조건에 false가 되기에 

x < 7은 자바스크립트가 쳐다보지도 않는다. 

둘 중에 하나만 false여도 전체 라인을 false로 본다. 

 

 

 

condition && expression

하지만 이 경우는 expression && expression 경우와 다르다.

둘 다 true 조건을 바라는 것이 아니다.

condition이 true면 expression을 렌더하라는 의미이다.

 

condition && expression

true && expression

false && expression

condition이 true면 express를 실행한다.

condition이 false면 express는 실행되지 않는다. 

 

 

 

그래서 ? : null 을 지우고 간단하게 && 표시로 나타낼 수 있다. 

 

currentTime < 12 가 true면 옆에 statement를 render한다. 

하지만 false면 statement는 쳐다보지도 않는다. 

&& 가 둘 다 참이여 한다는 표시가 아니다.

속지 말자. 

 

 

 


로그인과 회원가입 Conditional Rendering 하기 

 

 

Form.jsx 파일 하나로 login과 signup 두 형태 모두를 나타내보자. 

 

 

기본형 

 

 

회원 가입 여부에 따라 다른 Form 나오게 하기 

 

Register 

 

Login 

 

 

2 개의 폼을 만드는 것이 아니라 

조건에 따라 칸을 만들었다 없앴다 한다. 

 

 

Step 1)

Form.jsx 에서 상황에 따라 Register <---> Log In 글자를 바꿔보자. 

유저가 회원가입이 된 경우 글자를 Log in으로 

가입 안된 경우 Register 글자 나오게 하기 

 

userIsRegistered === true;  글자 Log in 으로 나오고 

userIsRegistered === false; 글자 Register로 나오기 

 

 

 

문제는 물어보는 건 app.jsx 파일에 있는데

바꿔야 하는 내용은 Form.jsx 파일에 있다.

어떻게 하면 다른 파일에 있는 내용을 바꿀 수 있을까?

 

Form.jsx에 있는 내용을 App.jsx 파일에 props로 pass over 한다. 

prop 이름을 isRegister로 한다.

이 값을 위에 있는 userIsRegistered과 같도록 맞춘다.

 

App.js

 

Form.jsx 파일에서 props를 받아 조건을 완성한다. 

 

 

true 일 때

 

 

false 일 때 

 

 

 

 

 

step 2) 

true 일 때 Confirm Password 칸 없애고 

false 이면 Confirm Password 칸 있게 하기 

 

 

props.isRegistered === false 와

!props.isRegisteered 같다.

 

 

 

userIsRegistered === true; 일 때 로그인 페이지 

 

 

userIsRegistered === false; 일 때 

 

댓글