조건부 렌더링
로그인한 방문자는 대시보드를 보고, 로그인하지 않은 방문자는 로그인 폼을 보며, 요청이 실패하면 페이지 어딘가에 에러 메시지가 나타나야 합니다. isLoggedIn 같은 불린 값은 보통 state에 저장되며, 현재 값에 따라 어떤 UI를 렌더링할지가 결정됩니다. JSX는 JavaScript이므로, 무엇을 렌더링할지 결정하는 것은 코드의 다른 모든 결정과 같은 방식으로 작동합니다. return 문 안에서 바로 값을 선택하는 표현식을 평가하면 됩니다.
삼항 연산자로 두 요소 중 선택하기
UI가 정확히 두 가지 중 하나가 될 수 있을 때, 삼항 연산자를 사용합니다:
return (
<div>
{isLoggedIn ? <Dashboard /> : <Login />}
{hasError && <p>Something went wrong</p>}
</div>
)isLoggedIn ? <Dashboard /> : <Login />는 다른 삼항 연산자처럼 읽힙니다. isLoggedIn이 참이면 이 표현식은 <Dashboard />로 평가되고, 그렇지 않으면 <Login />으로 평가됩니다. 평가된 결과가 무엇이든 JSX의 그 자리에 렌더링됩니다. 중괄호는 JavaScript 표현식을 마크업 중간에 삽입할 수 있게 해주며, 삼항 연산자는 다른 표현식처럼 하나의 표현식입니다.
&& 연산자로 한 요소 표시하거나 숨기기
두 번째 줄은 다른 형태의 결정을 다룹니다. 무언가를 표시하거나 아무것도 표시하지 않습니다. hasError && <p>Something went wrong</p>는 JavaScript의 다른 곳에서처럼 && 연산자를 사용합니다. hasError가 false이면, &&는 **단락 평가**되어 오른쪽의 JSX에 도달하지 않고 전체 표현식이 false로 평가됩니다. hasError가 true이면, 표현식은 <p> 요소로 평가됩니다.
이것이 올바르게 렌더링되는 이유는 React가 결과에 대해 무엇을 하는지에 달려 있습니다. React는 false, null, undefined에 대해서는 아무것도 렌더링하지 않습니다. 따라서 hasError가 false일 때, 페이지에 아무것도 나타나지 않습니다.
거짓 값의 함정
&&는 true나 false만 생성하지 않습니다. &&를 사용하는 다른 JavaScript 표현식처럼, 이것은 도달한 쪽의 값으로 평가되며, 그 값은 반드시 불린일 필요가 없습니다. 대부분의 경우 문제가 되지 않지만, 왼쪽이 숫자일 때 버그가 됩니다:
{count && <Badge />}
// count = 0 → 페이지에 "0"을 렌더링합니다count가 0이면, 이 표현식은 0으로 평가됩니다. React는 false, null, undefined에 대해서는 렌더링하지 않지만, 0은 실제 렌더링 가능한 값이므로 React는 이것을 페이지에 표시합니다. 배지는 나타나지 않지만, 여분의 0이 아무것도 표시될 것으로 예상된 곳에 나타납니다.
해결책은 &&의 왼쪽이 항상 실제 불린이 되도록 하는 것입니다:
{count > 0 && <Badge />}
// count = 0 → 아무것도 렌더링하지 않습니다count > 0은 항상 true 또는 false로 평가되므로, 표현식은 배지를 렌더링하거나 아무것도 렌더링하지 않으며, 0이 남겨지지 않습니다.
아무것도 렌더링하지 않기
때로 컴포넌트는 표시할 것이 없으며, 이를 나타내는 가장 명확한 방법은 조기에 반환하는 것입니다:
function Banner({ message }) {
if (!message) {
return null
}
return <p className="banner">{message}</p>
}message가 비어 있을 때, 함수는 JSX의 나머지를 구성하기 전에 null을 반환합니다. 이렇게 하면 주요 return이 실제로 렌더링할 것이 있는 경우에 집중되며, 전체를 하나의 조건으로 감싸는 대신 명확하게 유지됩니다.
&&는 한 요소를 표시하거나 아무것도 표시하지 않으며, 컴포넌트에서 null을 반환하는 것은 "렌더링할 것이 없습니다"라고 말하는 방법입니다. {count && <Badge />}에서 count가 0이 될 수 있을 때 주의하세요. 0은 React가 실제로 출력할 값이기 때문입니다. 대신 {count > 0 && <Badge />}를 쓰면 왼쪽이 참 불린으로 유지됩니다. 다음: Forms. 여기서는 state를 사용하여 입력 필드를 처리합니다.

