728x90
300x250
1. 컴포넌트는 하나의 부모 태그로 감싸야 한다.
오류코드
function Example() {
return (
<h1>Hello</h1><p>World</p>
);
}
위 코드는 "JSX elements must be wrapped in an enclosing tag" 오류를 발생시킨다.
수정코드
function Example() {
return (
<div>
<h1>Hello</h1>
<p>World</p>
</div>
);
}
또는 React Fragment를 사용할 수 있다.
function Example() {
return (
<>
<h1>Hello</h1>
<p>World</p>
</>
);
}
React Fragment를 사용하면 리액트 컴포넌트는 반드시 하나의 루트 노드를 반환해야 한다는 원칙에 위배 되지 않으면서 dom에는 표시 되지 않는 부모태그를 만들 수 있다.
2. 코드 가독성 유지
조건부 렌더링이 복잡해지면 별도 컴포넌트로 분리하는 것이 가독성을 높이는 방법이다.
가독성이 낮은 코드
function Example({ user }) {
return (
<div>
{user ? (
user.role === 'admin' ? (
<h1>Welcome, Admin!</h1>
) : (
<h1>Welcome, User!</h1>
)
) : (
<h1>Please log in.</h1>
)}
</div>
);
}
컴포넌트 분리로 개선
function AdminMessage() {
return <h1>Welcome, Admin!</h1>;
}
function UserMessage() {
return <h1>Welcome, User!</h1>;
}
function Example({ user }) {
if (!user) return <h1>Please log in.</h1>;
return user.role === 'admin' ? <AdminMessage /> : <UserMessage />;
}
3.불필요한 렌더링 방지
조건부 렌더링은 성능 최적화와도 연관이 있다. 불필요한 컴포넌트를 렌더링 하지 않도록 주의해야 한다.
비효율적인 코드
function Example({ isLoggedIn }) {
return (
<div>
{isLoggedIn && <Header />}
<Content />
{isLoggedIn && <Footer />}
</div>
);
}
위 코드에서는 Header와 Footer가 조건부 렌더링되지만, 매번 평가가 이루어져 성능에 영향을 미칠 수 있다.
메모이제이션으로 최적화
const Header = React.memo(() => <h1>Welcome</h1>);
const Footer = React.memo(() => <footer>Footer</footer>);
function Example({ isLoggedIn }) {
return (
<div>
{isLoggedIn && <Header />}
<Content />
{isLoggedIn && <Footer />}
</div>
);
}
리액트는 컴포넌트가 다시 렌더링될 때 기본적으로 모든 자식 컴포넌트도 다시 렌더링 된다.
그러나 React.memo를 사용해서 메모이제이션 해주면 props이 변하지 않을 경우 다시 렌더링 되지 않는다.
728x90
반응형
'Front-end > React' 카테고리의 다른 글
리액트에서 인라인 조건이란? (1) | 2025.01.03 |
---|---|
엘리먼트 변수로 조건부 렌더링 효율적으로 구현하기 (0) | 2025.01.02 |
리액트 : 조건부 렌더링 if, &&, ||, 삼항연산자, switch 등 (0) | 2024.12.31 |
IIFE 즉시 실행 함수 (() => {}) (0) | 2024.12.30 |
|| 논리 OR 연산자 :: 동작 원리 (0) | 2024.12.29 |
댓글