ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ReactJS] Conditional Rendering
    Programming/ReactJS 2022. 11. 30. 21:10

    Conditional Rendering

    조건에 따른 렌더링(조건부 렌더링)이라고 해석할 수 있다. 여기에서의 조건은 프로그래밍에서 일반적으로 사용하는 조건문 정도로 생각하면 된다.

    function UserGreeting(props) {
    	return <h1>Welcome back!</h1>;
        
    function GuestGreeting(props) {
    	return <h1>Sign in!</h1>
    }

    이러한 코드를 예시로 들어보자. 여기서 게스트와 유저를 구분지어 return 값을 반환해야 할 필요가 있다.

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

    위와 같이 조건에 따라 다른 렌더링을 진행하는 것을 조건부 렌더링이라고 한다.

    Truthy, Falsy

    // truthy
    true
    {} (empty object)
    [] (empty array)
    42 (number, not zero)
    "0", "false" (string, not empty)
    
    // falsy
    false
    0, -0 (zero, minus zero)
    0n (BigInt zero)
    '', "", `` (empty string)
    null
    undefined
    NaN (not a number)

    Element Variables

    React의 Element를 변수처럼 다루는 방법이다.

    button = <LogoutButton onClick = {handleLogoutClick} />;

    실제로는 button을 리턴하면 컴포넌트로 생성된 element 형태로 렌더링된다.

    Inline Conditions

    unreadMessages.length > 0 && // 조건문이 참이라면 뒤의 component 렌더링
        <h2>
            현재 {unreadMessages.length}개의 읽지 않은 메시지가 있습니다.
        </h2>

    조건문을 코드 안에 집어넣는다는 의미이다. Inline If는 '&&' 연산자를 사용하는데, 위의 경우처럼 앞의 조건이 참이면 뒤의 값이 결과값이 됨으로 렌더링 진행되는 성질을 이용하는 것이다. Inline If-Else는 '?' 연산자를 사용하는데, condition ? true : false 형태로 사용된다.

    <div>
        이 사용자는 현재 <b>{props.isLoggedIn ? '로그인' : '로그인하지 않은'}</b> 상태입니다.
    </div>

    Component의 렌더링을 막는 방법

    Null을 리턴하면 된다. 다음은 warning이 true라면 아무것도 출력하지 않는 형태의 소스코드이다.

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

    < Source />

    Toolbar.jsx

    import React from "react";
    
    const styles = {
        wrapper: {
            padding: 16,
            display: "flex",
            flexDirection: "row",
            borderBottom: "1px solid grey"
        },
        greeting: {
            marginRight: 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>
        )
    }
    
    export default LandingPage;

    ※ 본 게시글은 소플님의 강의 영상을 참고하여 작성되었습니다. 개인적인 공부 목적으로 사용하고 있고, 문제 시 비공개 전환하도록 하겠습니다.

    'Programming > ReactJS' 카테고리의 다른 글

    [ReactJS] Forms  (0) 2022.12.01
    [ReactJS] List and Keys  (0) 2022.11.30
    [ReactJS] Handling Events  (0) 2022.11.30
    [ReactJS] Hooks  (0) 2022.11.30
    [ReactJS] State and Lifecycle  (0) 2022.11.30

    댓글