- 조건을 의미한다
조건부 랜더링
- 어떠한 조건에 따라서 렌더링이 달라지는 것
- ex)True이면 버튼을 보여주고,
False이면 버튼을 가린다
2개의 컴포넌트
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/>; }
- 참이나 거짓이 아니지만 참이나 거짓으로 여겨지는 갑
- 많은 개발자들을 혼란에 빠뜨리니 잘 이해하고 가야한다
// 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(없는 값, 0 아님, 공백문자 아님) undefined(정의되지 않은, 할당되지 않은, 초기화되지 않은) NaN(not a number, 숫자가 아닌 값을 숫자로 처리하려는 경우, ex)숫자연산)
로그인, 로그아웃 처리 코드
-------------------------------------------------------------------------- // 버튼의 이름을 로그인으로 변경 function LoginButton(props) { return ( <button onClick={props.onClick}> 로그인 </button> ); } // 버튼의 이름을 로그아웃으로 변경 function LogoutButton(props) { return ( <button onClick={props.onClick}> 로그아웃 </button> ); } -------------------------------------------------------------------------- //사용자의 로그인 상태에 따라 버튼의 값을 변경하는 코드 function LoginControl(props) [ const [isLoggedIn, setIsLoggedIn] = useState(false); const handleLoginClick = () => { setIsLoggedIn(true); } const handleLogoutClick = () => { setIsLoggedIn(false); } let button; if (isLoggedIn) { // button에 컴포넌트(리엑트 엘리먼트) 대입 button = <LogoutButton onClick={handleLogoutClick}/>; } else { button = <LoginButton onClick={handleLoginClick} />; } return ( <div> <Greeting isLoggedIn={isLoggedIn}/> {button} // 랜더링 </div> ) } --------------------------------------------------------------------------
- In + Line : 조건문을 코드 안에 집어 넣는 것
function Mailbox(props) { const unreadMessages = props.unreadMessages; return ( <div> <h1>안녕하세요! 오늘도 라이딩 가시는 군요~</h1> {unreadMessage.length > 0 && // 조건문의 종류인 &&(그리고)연산자. // ex) A && B // -> A를 만족하고 B도 만족하면 반환하라 // 앞의 length 비교가 참이면 &&연산자 다음의 값을 반환한다 // 앞의 length 비교가 거짓이면 &&연산자 다음의 연산을 멈추고 false를 반환한다 <h2> 현재 {unreadMessages.length}개의 읽지 않은 메시지가 있습니다. </h2> // 즉, 언리드메시지에 데이터가 있어서 변수의 길이가 0보다 크면(데이터가 있으면) // && 연산자 다음에 오는 코드(<h2>현재...</h2>)를 실행시켜라 } </div> ); }
만약 unreadMessage.length가 0이면 랜더링을 안하는 것아 아니라
false값을 리턴해 변화는 없지만 연산을 수행한다
function Counter(props) { const count = 0; return ( <div> {count && <h1>현재 카운트: {count}</h1>} </div> ); }false는 아니지만
falsy값인 0이 count에 들어갔다
count는 false조건이다
div태그가 만들어 지고 count에 0이 들어가 false를 반환하고
div태그가 다시 닫히며
함수가 종료된다 -><div>0</div>
즉, false가 나온다고 해서 랜더링이 안되는 것은 아니다
- 삼항연산자(condition ? true : false)를 사용한다
function UserStatus(props) { return ( <div> 이 개발자는 현재 페라리를 <b>{props.isLoggedIn ? '소유한' : '소유하지 않은'}</b> 상태입니다. // isLoggedIn의 상태에 따라 문자열을 반환한다 </div> ) }
예제
function LoginControl(props) [ const [isLoggedIn, setIsLoggedIn] = useState(false); const handleLoginClick = () => { setIsLoggedIn(true); } const handleLogoutClick = () => { setIsLoggedIn(false); } // let button; // if (isLoggedIn) { // button에 컴포넌트(리엑트 엘리먼트) 대입 // button = <LogoutButton onClick={handleLogoutClick}/>; // } else { // button = <LoginButton onClick={handleLoginClick} />; // } // 이 문장 모두가 사라지고, return ( <div> <Greeting isLoggedIn={isLoggedIn}/> // {button} // 랜더링 {isLoggedIn ? // 로그인 되어있나요? <LogoutButton onClick={handleLogoutClick}/> // 로그인 안되어 있으면 해당 핸들러를 실행 : <LoginButton onClick={handleLoginClick}/>// 로그인 되어 있으면 해당 핸들러를 실행 </div> ) }
- null을 리턴하면 된다
function WarningBanner(props) { if (!props.warning) { // warning에 해당하지 않을 경우 return null; // null을 리턴시켜 아무 작업도 안하게 한다 } return ( // warning에 해당하여 if문을 벗어날 경우 <div>경고!</div> // div태그에 문자열을 담아 앨리먼트를 리턴시킨다 ); }이와달리 클래스 컴포넌트에서 return에 null을 주는 것은 생명주기에 영향을 주는 것이 아니라 효과가 없다