[React] 조건부 렌더링 패턴 Conditional Rendering Pattern

임동현·2022년 3월 22일

조건부 렌더링 패턴 Conditional Rendering Pattern
리액트의 조건부 렌더링 문서에서 조건에 따라 랜더링할 컴포넌트를 선택하는 방법을 소개하고 있지만 추가적으로 알아두면 유용한 best practices 패턴이 몇 가지 더 있어서, 하나씩 소개드리도록 하겠습니다.

if else 패턴

리액트 공식 문서에서 소개하는 가장 기본적인 패턴입니다.

function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return ;
}
else {
return ;
}
}
if 문 조건에 따라 UserGreeting 컴포넌트를 렌더링할지 GuestGreeting 컴포넌트를 렌더링할지 결정합니다.

if else 패턴은 컴포넌트가 조건에 따라 렌더링할 내용 전체가 결정되는게 특징인 패턴입니다. 이 패턴은 컴포넌트의 일부분만 선택적으로 렌더링하기 적합하지 않습니다.

예를 들어, 아래와 같이 if else 패턴을 작성하면 동작하지 않습니다.

function Greeting(props) {
const isLoggedIn = props.isLoggedIn;

return (
    <React.Fragment>
    {
        // 'Unexpected token' error 발생
        if (isLoggedIn) {
            return <UserGreeting />;
        }
        else {
            return <GeustGreeting />;
        }
    }
    </React.Fragment>
);

}
if else 패턴을 사용하면서 일부분만 렌더링하려면 즉시 실행 함수 (IIFE) 를 사용해야 가능합니다.

function Greeting(props) {
const isLoggedIn = props.isLoggedIn;

return (
    <React.Fragment>
    {
        // 즉시 실행 함수 IIFE
        (() => {
                if (isLoggedIn) {
                    return <UserGreeting />;
                }
                else {
                    return <GeustGreeting />;
                }
            }
        )();
    }
    </React.Fragment>
);

}
즉시 실행 함수를 사용한 if else 패턴은 가독성이 떨어지는 문제가 심각해, 사용을 권장하지 않습니다. 그리고 if else 패턴으로 렌더링 대상 전체가 변경된다면, 새로운 컴포넌트를 작성하는게 더 적합하기 때문에 if else 패턴은 효과적으로 활용하기 어려운 패턴입니다.

: ? 패턴

if else 패턴과 마찬가지로 리액트 공식 문서에서 인라인 If-Else 라고 소개하는 패턴입니다.

function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
return (
<React.Fragment>
// 삼항 연산자 ' (조건) ? (참일 경우) : (거짓일 경우) ' 로 부분 조건부 렌더링 구현
{ isLoggedIn ? ( ) : ( ) }
</React.Fragment>
);
}
: ? 패턴은 if else 패턴의 치명적인 단점인 부분 렌더링이 가능하도록 개선한 패턴입니다. : ? 패턴은 JavaScript 문법으로 간결하게 사용이 가능한게 장점인 패턴입니다. 하지만 : ? 패턴 또한 단점이 있는데 컴포넌트를 렌더링할지 말지 결정할 때 불필요하게 null 을 반환하는 코드를 작성해야 합니다.

function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
return (
<React.Fragment>
// 로그인했을 경우만 '' 를 렌더링
{ isLoggedIn ? ( ) : null }
</React.Fragment>
);
}
null 을 반환한다고 해서 심각한 성능 저하가 발생하지는 않기 때문에 그대로 사용해도 되지만, && 패턴으로 개선이 가능합니다.

&& 패턴

&& 패턴은 : ? 패턴과 함께 자주 사용되는 조건부 렌더링 패턴입니다. (선행 조건) && (후행 조건) 논리 연산자는 선행 조건이 참이어야만 후행 조건을 평가하고 후행 조건을 평가한 결과를 반환하는 특징이 있습니다.

(true && 'Hello');
// 결과 = 'Hello'
&& 패턴은 이러한 특징을 적극적으로 활용한 패턴입니다.

function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
return (
<React.Fragment>
{ isLoggedIn && ( ) }
</React.Fragment>
);
}
: ? 패턴이 null 을 반환하게 되는 경우를 보완하기 때문에, : ? 패턴과 && 패턴을 같이 사용하면 조건부 렌더링을 효과적으로 구현할 수 있습니다.

profile
프론트엔드 공부중

0개의 댓글