react 수업

9.conditional rendering

gongmille 2024. 9. 4. 14:33

-conditional rendering?

조건에 따른 렌더링 = 조건부 렌더링 = 어떠한 조건에 따라서 렌더링이 달라지는 것 =  조건문에 따라 렌더링이 달라지는 것

function UserGreeting(props) {
	return <h1>다시 오셨군요!</h1>
}
function GuestGreeting(props) {
	return <h1>회원가입을 해주세요</h1>
}

function Greeting(props){
	const isLoggedIn = props.isLoggedIn;
    
    //조건부 렌더링
    if(isLoggedIn){
    	return <UserGretting />;
    }
    return <GuestGreeting />;
}

예시

 

-Elemet Variables

렌더링 해야 될 컴포넌트를 변수처럼 다루고 싶을때 쓰는 방법 = 엘리먼트 변수

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

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

function LoginControl(props){
	const [isLoggedIn,setIsLoggedIn] = useSate(false);
    
    const handleLoginClick = () => {
    	setIsLoggedIn(true);
    }
    const handleLogoutClick = () => {
    	setIsLoggedIn(false);
    }
    
    let button;
    if(isLoggedIn){
    	button = <LogoutButton onClick={handleLogoutClick} />;
    }else{
    	button = <LoginButton onClick={handleLoginClick} />;
    }
    
    return(
    	<div>
        	<Greeting isLoggedIn={isLoggedIn}/>
            {button}
        </div>
    );
}

예시

 

-inline conditions

코드를 별도로 분된 곳에 작성하지 않고 해당코드가 필요한 곳 안에 작성한다 = 조건문을 코드 안에 집어넣는 것

실제 if를 쓰진 않는다.

function MailBox(props){
	const unreadMessages = props.unreadMessages;
    
    return (
    	<div>
        	<h1>안녕하세요</h1>
            {unreadMessages.length >0 &&
            <h2>현재 {unreadMessages.length}개의 읽지 않은 메세지가 있습니다.</h2>
            }
        </div>
	);
}

예시 - unreadMessages.length가 0보다 크면 <h2>가 출력이 되고 작거나 같으면 출력되지 않는다.

 

이때 앞에 부분은 값은 그대로 리턴 되기 때문에 주의해야한다.

const count =0;

return (
	<div>
    	{count && <h1>현재 카운트 : {count}</h1>}
    </div>
);

예시 - 이 경우 0이라는 count값이 출력된다.

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

예시 - 삼항 연산자를 이용해 두 결과값 중 하나는 반드시 나오도록 한다.

function LoginControl(props){
	const [isLoggedIn,setIsLoggedIn] = useSate(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>
    );
}

예시

 

-실습

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;

Toolbar.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;

LandingPage.jsx

 

(index.js 생략)

 

결과는 위와 같이 나오며 로그인을 누르면 설정한 인삿말과 버튼 안의 글씨가 바뀌는 걸 확인 할 수 있다.

 

'react 수업' 카테고리의 다른 글

11. forms  (1) 2024.09.05
10.List, key  (0) 2024.09.05
8.event  (0) 2024.09.04
7.hooks  (1) 2024.09.03
6.state와 lifecycle  (1) 2024.09.03