JSX에서 삼항 연산자를 사용한 조건부 렌더링은 간단한 경우 유용하지만, 복잡한 경우엔 가독성을 해치기 쉽다.
조건에 따라 렌더링할 UI를 함수로 분리한다.
const MyComponent = ({ isUserClick }) => {
const renderButton = () => {
return isUserClick ? (
<button className="clicked">클릭됨</button>
) : (
<button className="unclicked">클릭하기</button>
);
};
return <div>{renderButton()}</div>;
}
조건별로 다른 UI를 객체로 관리한다.
const MyComponent = ({ isUserClick }) => {
const buttonMap = {
true: <button className="clicked">클릭됨</button>,
false: <button className="unclicked">클릭하기</button>,
};
return <div>{buttonMap[isUserClick]}</div>;
}
JSX 내에서 조건부 렌더링이 복잡할 경우, return을 빠르게 분기 처리한다.
const MyComponent = ({ isUserClick }) => {
if (isUserClick) {
return <button className="clicked">클릭됨</button>;
}
return <button className="unclicked">클릭하기</button>;
}
map을 사용하는 경우에는 반복되는 JSX 구조가 복잡해질 수 있으므로 다음과 같은 패턴을 사용할 수 있다.
배열의 각 항목을 렌더링하는 로직을 별도 컴포넌트로 분리한다.
const UserCard = ({ info }) => {
return (
<div className="user-card">
<div>이름: {info.name}</div>
<div>나이: {info.age}</div>
<div>키: {info.height}</div>
</div>
);
}
const UserList = ({ userInfo }) => {
return (
<div>
{userInfo.map(info => (
<UserCard key={info.id} info={info} />
))}
</div>
);
}
map 함수 내의 복잡한 로직을 별도 함수로 추출한다.
const renderUserInfo = (info) => {
return (
<div className="user-card" key={info.id}>
<div>이름: {info.name}</div>
<div>나이: {info.age}</div>
<div>키: {info.height}</div>
</div>
);
}
const UserList = ({ userInfo }) => {
return <div>{userInfo.map(renderUserInfo)}</div>;
}
데이터에 따라 그룹화하거나, 더 명확한 구조로 만들어 JSX에 전달한다.
const UserList = ({ userInfo }) => {
const groupedUsers = userInfo.reduce((acc, user) => {
const group = user.age > 30 ? 'adults' : 'youth';
acc[group] = acc[group] || [];
acc[group].push(user);
return acc;
}, {});
return (
<div>
<h2>청소년</h2>
{groupedUsers.youth?.map(user => (
<div key={user.id}>{user.name}</div>
))}
<h2>성인</h2>
{groupedUsers.adults?.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
);
}
JSX를 역할별로 명확히 분리하여 가독성을 높인다.
const MyComponent = () => {
const renderHeader = () => <header>헤더</header>;
const renderContent = () => <main>메인 콘텐츠</main>;
const renderFooter = () => <footer>푸터</footer>;
return (
<div>
{renderHeader()}
{renderContent()}
{renderFooter()}
</div>
);
}
공통된 패턴을 가진 JSX를 처리하는 고차 컴포넌트를 만든다.
const withCard = (WrappedComponent) => {
const CardWrapper = (props) => {
return (
<div className="card">
<WrappedComponent {...props} />
</div>
);
};
return CardWrapper;
};
const UserInfo = ({ name, age }) => {
return (
<div>
<div>이름: {name}</div>
<div>나이: {age}</div>
</div>
);
};
const UserInfoCard = withCard(UserInfo);
const App = () => {
return <UserInfoCard name="홍길동" age={30} />;
};
export default App;