어떠한 조건에 따라서 렌더링이 달라질 때 자주 쓰이기 때문에사용 방법과 원리에 대해서 잘 이해하고 넘어가야한다.
boolean 자료형
true / false
{} : empty object
[] : empty array
number : not zero
"0", "false" : String, not empty
false
0, -0 : zero, minus zero
'', "", `` : empty string
null
undefined
NaN
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
[line if]
jsx에서는 중괄호를 사용해서 입력한다.
if문을 필요한 곳에 직접 넣어서 사용하는 의미이다.
function conditional() {
return (
<div>
<h1>안녕하세요.</h1>
{
unreadMessages.lenght > 0 &&
<h2>
현재 {unreadMessages.lenght}개의 읽지 않은 메세지가 있습니다.
</h2>
}
</div>
)
}
import React from 'react'
function conditional() {
const count = 0
return (
<div>
{count && <h1>현재 카운트: {count}</h1>}
</div>
)
}
export default conditional
//출력결과 : <div>0</div>
// 화면에 아무것도 안나오는 것이 아니라. 결과값이 그대로 리턴된다.
주의사항
앞의 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
import React from 'react'
function WarningBanner(props) {
if (!props.warning) { return null }
return (
<div>경고
</div>
)
}
export default WarningBanner
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
//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