REACT/[inflearn] 처음만난 리액트

9강. Conditional Rendering

web_seul 2022. 11. 10. 22:10
반응형

Conditional Rendering의 정의와 inline Conditions

Conditional Rendering : 조건부 렌더링, 어떠한 조건에 따라서 렌더링이 달라지는 것

function UserGreeting(props){
  return <h1>다시 오셨군요!</h1>
}

function GuestGreeting(props){
  return <h1>회원가입을 해주세요.</h1>
}

function Greeting(props){
  const isLoggedIn = props.isLoggedIn;
  
  if(isLoggedIn){
    return <UserGreeting />;
  }
  return<GuestGreeting />;
}

 

JS의 Truthy와 Falsy

//Truthy : true는 아니지만 true로 여겨지는 값
true
{} (empty object)
[] (empty array)
42 (number, not zero)
"0", "false" (string, not empty)

//Falsy : false는 아니지만 false로 여겨지는 값
false
0, -0 (zero, minus zero)
0n (BigInt zero)
'', "", `` (empty string)
null
undefined
NaN (not a number)

 

Element Variables : element를 변수처럼 다루는 방법

function LoginButton(props){
  return (
    <button onClick = {props.inclick}>
      로그인
    </button>
  );
}

function LogoutButton(props){
  return (
    <button onClick = {props.inclick}>
      로그아웃
    </button>
  );
}

function LoginControl(props){
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  const handleLoginClick = () => {
    setIsLoggedIn(true);
  }
   const handleLogoutClick = () => {
    setIsLoggedIn(false);
  }
  
  let button;	//button이라는 변수에 컴포넌트 대입 = element variable
  if(isLoggedIn){  
    //로그인상태이면 로그아웃버튼 보이기
    button = <LogoutButton onclick = {handleLogoutClick} />;
  } else {
    //로그아웃상태이면 로그인버튼 보이기
    button = <LoginButton onclick = {handleLoginClick} />;
  }
  
  return (
    <div>
      <Greeting isLoggedIn = {isLoggedIn}>
      {button}
    </div>
  )
}

 

inline Conditions : 조건문을 코드안에 집어넣는 것

inline-if 

//단축평가
true && dummy -> dummy
false && dummy -> false
function Mailbox(props){
  const unreadMessages = props.unreadMessages;
  
  return(
    <div>
      <h1>안녕하세요</h1>
      {unreadMessages.length > 0 &&
        <h2>
          현재 {unreadMessages.length}개의 읽지않은 메시지가 있습니다.
        </h2>
      }
    </div>
  );
}
function Countr(props){
  const count = 0;
  return (
    <div>
      {count && <h1>현재 카운트 : {count}</h1>}
      //주의!
      //count가 false일 경우
      //<div> 0 </div>로 출력됨
    </div>
  );
}

 

inline-if-else

//삼항연산자
condition ? true : false
function UserStatus(props){
  return (
    <div>
      이 사용자는 현재 <b>{props.isLoggedIn ? '로그인' : '로그인하지 않은'}</b> 상태입니다.
    </div>
  )
}
//element삼항연산자
function LoginControl(props){
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  const handleLoginClick = () => {
    setIsLoggedIn(true);
  }
  const handleLogoutClick = () => {
    setIsLoggedIn(false);
  }
  
  return(
    <div>
      <Greeting isLoggedIn = {isLoggedIn} />
      {isLoggedIn 
        ?      
        <LogoutButton onClick = {handleLogoutClick} />
        :
        <LoginButton onClick = {handleLoginClick} />
      }
    </div>
  )
}

 

Component 렌더링 막기 : null을 리턴하면 렌더링되지 않음

function WarningBanner(props){
  if (!props.warning){
    return null;
  }
  return(
    <div>경고</div>
  );
}

function MainPage(props){
  const [showWarning, setShowWarning] = useState(false);
  const handleToggleClick = () => {
    setShowWarning(prevShowWarning => !prevShowWarning);
  }
  return(
    <div>
      <WarningBanner warning = {showWarning}>
      <button onClick = {handleToggleClick}>
        {showWarning ? '감추기' : '보이기'}
      </button>
    </div>
  )
  
}

 

(실습) 로그인 여부를 나타내는 툴바 만들기

//Toolbar.jsx
import React from "react";

const styles = {
    wrapper: {
        padding: 16,
        display: "flex",
        flexDirection: "row",
        borderBottom: "1px solid grey",
    },
    greeting:{
        marginRignt: 8,
    },
};

function Toolbar(props){
    const{isLoggedIn, onClickLogin, onClickLogout} = props;
    return(
        <div style={styles.wrapper}>
            {isLoggedIn && <span style={styles.greeting}>환영합니다.</span>}
            
            {isLoggedIn ? (
                <button onClick={onClickLogout}>로그아웃</button>
            ) : (
                <button onClick={onClickLogin}>로그인</button>
            )}
        </div>
    )
}
export default Toolbar;

//Landingpage.jsx
import React, {useState} from "react";
import Toolbar from "./Toolbar";

function LandingPage(props){
    const [isLoggedIn, setIsLoggedIn] = useState(false);
    const onClickLogin = () => {
        setIsLoggedIn(true);
    };
    const onClickLogout = () => {
        setIsLoggedIn(false);
    };

    return(
        <div>
            <Toolbar
                isLoggedIn={isLoggedIn}
                onClickLogin={onClickLogin}
                onClickLogout={onClickLogout}
            />
            <div style={{padding:16}}>리액트 공부!</div>
        </div>
    )
}
export default LandingPage;

//index.js
root.render(
  <React.StrictMode>
    <Landingpage />
  </React.StrictMode>
)

 

 

 

반응형

'REACT > [inflearn] 처음만난 리액트' 카테고리의 다른 글

11강. Forms  (0) 2022.11.21
10강. List and Keys  (0) 2022.11.11
8강. Handling Events  (0) 2022.11.09
7강. Hooks  (0) 2022.11.08
6강. State와 Lifecycle  (0) 2022.11.03