본문 바로가기
Framework/React

conditional rendering

by cariño 2022. 10. 11.
728x90
반응형

어떠한 조건에 따라서 렌더링이 달라질 때 자주 쓰이기 때문에사용 방법과 원리에 대해서 잘 이해하고 넘어가야한다.

truthy falsy

boolean 자료형
true / false

 

  • true는 아니지만 true로 여겨지는 값: truthy
{} : empty object
[] : empty array
number : not zero
"0", "false" : String, not empty

 

  • false는 아니지만 false로 여겨지는 값 : falsy
false
0, -0 : zero, minus zero
'', "", `` : empty string
null
undefined
NaN

 

 


Element Variables (엘리먼트 변수)

  • 렌더링 해야할 컴포넌트를 변수처럼 다루고 싶을 때 사용한다.

 

import React from 'react'
import { useState } from 'react'

function LoginControl(props) {

    const [isLoggedIn, setIsloggdIn] = useState(false)
    const handeLoginClick = () => {
        setIsloggdIn(true)
    }

    const handleLogOutClick = () => {
        setIsloggdIn(false)
    }

    let button; // 컴포넌트 대입

    if (isLoggedIn) { //true라면 로그인 된 상태여서 로그아웃 버튼이 전달됨 
        button = <LogoutButton onClick={handleLogOutClick} />
    } else { //false일 경우 로그인 버튼이 전달 
        button = <LoginButton onClick={handeLoginClick} />
    }

    return (
        <div>
            <Greeting isLoggedIn={isLoggedIn} />
            {button} //실제로 엘리먼트
        </div>
    )
}

export default LoginControl
  • isLoggedIn값에 따라서 변수에 컴포넌트를 대입하고 있다.
  • 컴포넌트가 대입된 변수를 return에 넣고 실제로 컴포넌트가 렌더링 되도록 만들어진 리액트 엘리먼트이다.

inline conditions

  • 위에 변수에 컴포넌트를 대입한것보다 조금 더 간결하게 사용할 수 있다.
  • 조건문을 코드 안에 집어넣는 의미이다.

[line if]
jsx에서는 중괄호를 사용해서 입력한다.
if문을 필요한 곳에 직접 넣어서 사용하는 의미이다.

  • && 논리 연산자를 사용한다. (단축평가)
  • 결과가 정해져있는 문에서 굳이 불필요한 연산은 하지 않는것이다.
  • 양쪽에 나오는 조건이 모두 true일 경우에만 실행한다.
  • 한쪽의 조건문이 하나라도 false일 경우 false를 반환한다.

 

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

 

  • unreadeMessages.lenght의 크기가 0보다 작으면 아무것도 렌더링 되지 않는다.
import React from 'react'

function conditional() {
    const count = 0
    return (
        <div>
            {count && <h1>현재 카운트: {count}</h1>}
        </div>
    )
}

export default conditional

//출력결과 : <div>0</div>
// 화면에 아무것도 안나오는 것이 아니라. 결과값이 그대로 리턴된다. 

 

주의사항

  • && 연산자 사용 중에 조건문에 falsy expresstion을 사용한다면 뒤에 나오는 조건문은 평가되지 않지만, falsy expresstion의 결과값이 그대로 return된다.

inline if-Else

앞의 inline if는 보여주거나 혹은 안보여주거나의 조건이였지만, inline if-Else는 조건문의 값에 따라 다른 엘리먼트를 보여줄 때 사용한다. 이를 위해 삼항연산자를 사용한다.

 

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

 

 

// 조건에 따른 컴포넌트 렌더링
import React from 'react'

function UserStatus(props) {
    const handelLogoutClick = () => {
        isLoggedIn(true)
    }
    const handelLoginClick = () => {
        isLoggedIn(false)
    }
    return (
        <div>
            <Greeting isLoggedIn={isLoggedIn} />
            {
                isLoggedIn
                    ? <LogoutButton onClick={handelLogoutClick} />
                    : <LoginButton onClick={handelLoginClick} />
            }
        </div>
    )
}

export default UserStatus

 

 


컴포넌트를 렌더링 하고 싶지 않을 때는?

  • 리액트에서는 null을 리턴하면 렌더링하지 않는다.
import React from 'react'

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

export default WarningBanner
  • props.warning의 값이 false인경우 null을 return시킨다.
  • rops.warning의 값이 true인 경우에만 경고메세지를 출력한다.

 

import React from 'react'
import { useState } from 'react'
import WarningBanner from './WarningBanner'

function Greeting(props) {
    const [showMessages, setShowMessages] = useState(false)

    const handleToggleClick = () => {
        setShowMessages(prevshowWarning => !prevshowWarning)
    }
    return (
        <div>
            <WarningBanner warning={showMessages} />
            <button onClick={handleToggleClick}>
                {showMessages ? '감추기' : '보이기'}
            </button>
        </div>
    )
}

export default Greeting
  • true일때: 경고와 함께 감추기가 보여진다.
  • false일때: null / 보이기

 


로그인 여부를 나타내는 툴바 만들기

//Toolbar.jsx
import React from 'react'

function Toolbar(props) {

    const { isLoggedIn, onClickLogin, onClickLogout } = props;
    return (
        <div>
            {isLoggedIn && <span>환영합니다!</span>}
            {isLoggedIn ? (
                <button onClick={onClickLogout}>로그아웃</button>
            ) : (
                <button onClick={onClickLogin}>로그인</button>
            )}
        </div>
    )
}

export default Toolbar

 

//LandingPage.jsx
import React from 'react'
import Toolbar from './Toolbar'
import { useState } from 'react'
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
728x90

'Framework > React' 카테고리의 다른 글

리액트 CRUD 해보기  (0) 2022.10.22
React Context API  (0) 2022.10.12
리액트에서 setState는 비동기로 동작 ??  (1) 2022.10.03
React TodoList 만들기  (0) 2022.10.03
useEffect()  (1) 2022.09.29

댓글