ShowChildren 컴포넌트: 조건부 렌더링을 위한 선언적 접근

박진현·2024년 1월 16일
4
post-thumbnail

왜 만들었는가?

React에서 컴포넌트의 Return 부분을 분석할 때, 각 컴포넌트의 구성을 순차적으로 이해하는 것이 중요합니다. 그러나 조건부 렌더링을 사용하면 때때로 이 순차적 구성이 명확히 드러나지 않아 혼란스러움을 경험할 수 있습니다. 이러한 문제를 해결하고자, 조건부 렌더링을 보다 명확하고 선언적으로 표현할 수 있는 'ShowChildren' 컴포넌트를 개발하게 되었습니다.

ShowChildren 컴포넌트 소개

'ShowChildren'은 조건부 렌더링을 위한 범용 컴포넌트입니다. _if prop이 참이거나 참을 반환하는 함수일 경우, children 컴포넌트를 렌더링합니다. 반대로 _if가 거짓이거나 거짓을 반환하는 함수일 경우, _else 컴포넌트를 렌더링합니다.

Props

  • _if: boolean | Function - 렌더링 여부를 결정하는 불리언 값 또는 함수.
  • _else: JSX.Element | null - _if가 거짓일 때 렌더링할 컴포넌트.
  • children: JSX.Element - _if가 참일 때 렌더링할 컴포넌트.

Example

as-is

function Mailbox({unreadMessages}) {
  return (
    <div>
      <h1>Hello!</h1>
      {unreadMessages.length > 0 ? (
        <h2>You have {unreadMessages.length} unread messages.</h2>
      ) : (
        <ReadAllMessages />
      )}
    </div>
  );
}

to-be

function Mailbox({unreadMessages) {
  return (
    <div>
      <h1>Hello!</h1>
      <ShowChildren _if={unreadMessages.length > 0} _else={<ReadAllMessages />}>
        <h2>You have {unreadMessages.length} unread messages.</h2>
      </ShowChildren>
    </div>
  );
}

Code

import { ReactNode } from 'react';

interface Props<Condition extends boolean | Function> {
  _if: Condition;
  _else: JSX.Element | null;
  children: ReactNode;
}

export function ShowChildren<Condition extends boolean | Function>({
  _if,
  _else = null,
  children,
}: Props<Condition>) {
  if (typeof _if === 'function') {
    return _if() ? children : _else;
  }

  return _if ? children : _else;
}
profile
👨🏻‍💻 호기심이 많고 에러를 좋아하는 프론트엔드 개발자 박진현 입니다.

2개의 댓글

comment-user-thumbnail
2024년 1월 21일

오오 재미있는 접근 방식인 것 같아요!

진현님 글을 보고나니 아래와 같이 만들어봐도 재미있겠다는 생각이 드네요!
좋은 인사이트 감사합니다🤩

<ConditionalRender condition={someCondition}>
  <ConditionalRender.When>
    {/* 조건이 참일 때의 내용 */}
  </ConditionalRender.When>
  <ConditionalRender.Otherwise>
    {/* 조건이 거짓일 때의 내용 */}
  </ConditionalRender.Otherwise>
</ConditionalRender>
1개의 답글