https://react.dev/learn/conditional-rendering을 읽고 정리한다.
컴포넌트는 종종 조건에 따라 다른 것을 보여줄 필요가 있다.
리액트에서는 JS 문법(if
, &&
, ? :
)을 사용해 조건에 따라 JSX를 렌더링 할 수 있다.
조건에 따라 JSX를 반환하기
PackingList
컴포넌트는 여러 Item
들을 렌더링 한다.
Item
컴포넌트들은 isPacked
prop이 true
가 되면 checkmark(✔)를 추가하고 싶다고 하자.
이는 if
/else
문 사용해 해결할 수 있다.
if (isPacked) {
return <li className="item">{name} ✔</li>;
}
return <li className="item">{name}</li>;
조건에 따라 아무것도 반환하지 않기(null
)
몇 가지 상황에서, 아무것도 렌더링 하고 싶지 않을 수도 있다. 예를 들어, isPacked===true
인 아이템을 보여주고 싶지 않을 수도 있다. 하지만 컴포넌트는 항상 무언가를 반환해야 하므로, 이 경우 null
을 리턴할 수 있다.
if (isPacked) {
return null;
}
return <li className="item">{name}</li>;
실제로 null
을 반환하는 것은 일반적이지 않다(렌더링 하려는 개발자를 놀라게 할 수 있기 때문ㅜㅜ).
더 자주 사용되는 방법으로, 부모 컴포넌트의 JSX에서 조건에 따라 특정 컴포넌트를 포함하거나 제외하는 방법이 사용된다. 그 내용은 다음 문단에서 설명하겠다.
조건에 따라 JSX를 포함하기
이전 예제에서는 컴포넌트를 반환하는 것으로 JSX 트리를 컨트롤했다. 렌더 출력에서 아래와 같은 중복이 발생한다.
아래 두 가지 코드는 거의 비슷하다.
<li className="item">{name} ✔</li>
<li className="item">{name}</li>
이러한 중복은 최악은 아니지만, 코드를 유지 보수하기 어렵게 만들 수 있다.
- 만약
className
을 변경하고 싶다면? 두 번 고쳐야 한다!
반복 작업을 제거하기 위해 JSX에서 조건 연산자를 사용할 수 있다.
조건 연산자 사용하기(? :
)
isPacked === true
이면, name + ' ✔'
를 렌더링 하고, 아니면 name
을 렌더링 한다.
<개선 전>
if (isPacked) {
return <li className="item">{name} ✔</li>;
}
return <li className="item">{name}</li>;
<개선 후>
return (
<li className="item">
{isPacked ? name + ' ✔' : name}
</li>
);
다른 HTML 태그에서 item의 텍스트를 더 복잡하게 만들고 싶다고 하자.
케이스마다 많은 JSX 중첩을 쉽게 하기 위해 줄 바꿈과 괄호를 사용해 추가할 수 있다.
이 스타일은 간단한 조건일 때 적합하다. 만약 컴포넌트가 조건을 가진 마크업이 중첩되고 너무 많으면 지저분해지기 때문에 자식 컴포넌트를 추출하여 정리하는 것을 고려해야 한다. React에서 마크업은 코드의 일부임으로 변수나 함수와 같은 도구를 사용해 복잡한 표현식을 정리할 수 있다.
And 연산자(&&
)
또 다른 일반적인 방법은 JS의 AND 연산자를 사용하는 것이다. 리액트 컴포넌트들에서, 조건이 true
일 때만 아니면 일부 JSX를 렌더링 하고 그렇지 않으면 아무것도 렌더링 하지 않을 때 자주 사용된다.&&
를 사용해 조건적으로 isPacked
가 true
일 때 체크 마크를 렌더링 할 수 있다.
return (
<li className="item">
{name} {isPacked && '✔'}
</li>
);
&&
문법은 왼쪽의 조건이 true
일 때만 오른쪽의 값을 반환한다. 하지만, 왼쪽의 조건이 false
라면, 전체 조건식을 false
가 된다.
리액트는 false
를 JSX 트리에서 "hole"로 인식하며, 이는 null
또는 undefined
와 같다. 그리고 이 부분은 아무것도 렌더링 하지 않는다.
Pitfall :
&&
왼편에 숫자를 넣지 마라.조건을 테스트하기 위해, JS는 자동적으로 왼편을 불리언으로 변환한다.
그러나, 왼편에0
이 있으면 리액트는0
을 렌더링 하게 된다.예를 들어, 흔히 하는 실수로
messageCount && <p>New messages</p>
같이 코드를 작성한다.
이 코드는messageCount
가0
일 때 아무것도 렌더링 하지 않는 것으로 생각하지 싶지만, 실제로는0
자체를 렌더링 한다.따라서 고치기 위해, 왼편을 불리언 값으로 만들어야 한다.
=>messageCount > 0 && <p>New messages</p>
변수를 이용해 조건적으로 JSX를 할당하기
코드를 작성할 때 위의 간단한 문법이 방해가 된다면, if
문과 변수를 사용할 수 있다.
- 변수를 정의할 때
let
사용하면 값을 재정의할 수 있으므로, 처음엔 보여주고 싶은 기본 내용(name
)을 할당한다. let itemContent = name;
if
문을 사용해isPacked
가true
일 때만itemContent
를 재할당한다.if (isPacked) { itemContent = name + " ✔"; }
- 반환할 JSX 트리 안에 중괄호를 사용해 변수를 추가한다.(중괄호를 사용해 JS를 문법을 사용 가능)
<li className="item"> {itemContent} </li>
이 스타일은 이전보다 간단하진 않지만, 가장 유연하다.
이전에는 텍스트만 사용했지만, JSX도 가능하다.
'React > Learn React' 카테고리의 다른 글
Escape Hatches ☞ Manipulating the DOM with Refs (0) | 2023.04.23 |
---|---|
Managing State ☞ Preserving and Resetting State (0) | 2023.04.01 |
Adding Interactivity ☞ Queueing a Series of State Updates (0) | 2022.12.04 |
Escape Hatches ☞ Referencing Values with Refs (0) | 2022.12.04 |
Managing State ☞ Scaling Up with Reducer and Context (0) | 2022.10.31 |