✅ React 컴포넌트와 일반 함수의 모든 가능한 경우의 수 정리
🚀 가능한 모든 경우를 포함하여 React 컴포넌트에서 발생할 수 있는 오류와 허용되는 반환값을 체계적으로 정리했습니다.
🔹 React 컴포넌트 vs. 일반 함수 - 가능한 모든 경우 (오류 여부 포함)
경우 | 첫 글자 대문자? | JSX 반환? | <컴포넌트명 /> 사용 가능? |
오류 여부 | React 컴포넌트 여부 | 예제 |
---|---|---|---|---|---|---|
✅ 정상적인 React 컴포넌트 | ✅ O | ✅ O | ✅ O | ❌ 오류 없음 | ✅ React 컴포넌트 | function MyComponent() { return <h1>Hello</h1>; } |
❌ JSX를 반환하지 않음 (일반 함수) | ✅ O | ❌ X | ❌ X | ❌ 오류 없음 | ❌ 일반 함수 | function NotAComponent() { return 42; } |
❌ JSX를 반환하지만 <컴포넌트명 /> 형태로 사용되지 않음 |
✅ O | ✅ O | ❌ X | ❌ 오류 없음 | ❌ 일반 함수 | return MyComponent(); (직접 호출) |
❌ JSX 대신 숫자 반환 | ✅ O | ❌ X | ✅ O | ❌ 오류 없음 (숫자는 렌더링됨) | ❌ 일반 함수 | function MyComponent() { return 42; } |
❌ JSX 대신 객체 반환 | ✅ O | ❌ X | ✅ O | ✅ 오류 발생 | ❌ 일반 함수 | function MyComponent() { return {}; } |
❌ JSX 대신 함수 반환 | ✅ O | ❌ X | ✅ O | ✅ 오류 발생 | ❌ 일반 함수 | function MyComponent() { return function() {}; } |
❌ undefined 반환 |
✅ O | ❌ X | ✅ O | ✅ 오류 발생 | ❌ 일반 함수 | function MyComponent() { return undefined; } |
✅ null 반환 |
✅ O | ✅ O | ✅ O | ❌ 오류 없음 | ✅ React 컴포넌트 | function MyComponent() { return null; } |
✅ true 또는 false 반환 |
✅ O | ❌ X | ✅ O | ❌ 오류 없음 (React는 무시) | ❌ 일반 함수 | function MyComponent() { return false; } |
✅ <></> (Fragment) 반환 |
✅ O | ✅ O | ✅ O | ❌ 오류 없음 | ✅ React 컴포넌트 | function MyComponent() { return <>Hello</>; } |
✅ 빈 배열 [] 반환 |
✅ O | ✅ O | ✅ O | ❌ 오류 없음 | ✅ React 컴포넌트 | function MyComponent() { return []; } |
✅ JSX 포함된 배열 반환 | ✅ O | ✅ O | ✅ O | ❌ 오류 없음 | ✅ React 컴포넌트 | function MyComponent() { return [<h1>Hi</h1>, "Text"]; } |
❌ 소문자로 시작하는 경우 | ❌ X | ✅ O | ❌ X | ✅ 오류 발생 (HTML 태그로 인식됨) | ❌ 일반 함수 또는 HTML 태그 | function myComponent() { return <h1>Hello</h1>; } |
✅ React.createElement() 반환 |
✅ O | ✅ O | ✅ O | ❌ 오류 없음 | ✅ React 컴포넌트 | function MyComponent() { return React.createElement('h1', null, 'Hello'); } |
❌ console.log() 실행 후 JSX 반환 없음 |
✅ O | ❌ X | ✅ O | ✅ 오류 발생 (MyComponent(...) must return a React element ) |
❌ 일반 함수 | function MyComponent() { console.log("Hello"); } |
❌ setTimeout 내부에서 JSX 반환 |
✅ O | ❌ X | ✅ O | ✅ 오류 발생 (Functions are not valid as a React child ) |
❌ 일반 함수 | function MyComponent() { setTimeout(() => { return <h1>Hello</h1>; }, 1000); } |
✅ JSX가 아닌 JSX-like 문자열 반환 | ✅ O | ❌ X | ✅ O | ✅ 오류 발생 (Objects are not valid as a React child ) |
❌ 일반 함수 | function MyComponent() { return "<h1>Hello</h1>"; } |
✅ Promise 반환 |
✅ O | ❌ X | ✅ O | ✅ 오류 발생 (Objects are not valid as a React child ) |
❌ 일반 함수 | function MyComponent() { return Promise.resolve(<h1>Hello</h1>); } |
🔹 추가적인 경우의 수
1️⃣ React.createElement()
사용 시 정상 동작
function MyComponent() {
return React.createElement('h1', null, 'Hello'); // ✅ 정상 실행
}
📌 React는 내부적으로 JSX를 React.createElement()
로 변환하므로, 직접 사용해도 정상 동작함.
2️⃣ console.log()
실행 후 반환값 없음 (오류 발생)
function MyComponent() {
console.log("Hello");
// ❌ JSX를 반환하지 않음 → 오류 발생
}
📌 React 컴포넌트는 return
이 필요하므로, JSX 또는 null
을 반환하지 않으면 오류 발생.
3️⃣ setTimeout
내부에서 JSX 반환 (오류 발생)
function MyComponent() {
setTimeout(() => {
return <h1>Hello</h1>; // ❌ React 컴포넌트는 비동기 반환을 허용하지 않음
}, 1000);
}
📌 비동기적으로 JSX를 반환하면 React가 렌더링할 수 없으므로 오류 발생.
✅ 해결 방법: useState
와 useEffect
를 사용해야 함.
function MyComponent() {
const [content, setContent] = React.useState(null);
React.useEffect(() => {
setTimeout(() => {
setContent(<h1>Hello</h1>);
}, 1000);
}, []);
return content;
}
📌 이렇게 하면 React가 상태 변화(setState
)를 감지하여 다시 렌더링 가능.
4️⃣ JSX 대신 문자열을 반환하는 경우 (오류 발생)
function MyComponent() {
return "<h1>Hello</h1>"; // ❌ JSX가 아닌 단순 문자열 반환 → 오류 발생 가능
}
📌 React는 문자열을 렌더링할 수 있지만, JSX는 따옴표가 필요하지 않음.
📌 실수로 문자열을 반환하면 React가 이를 JSX로 인식하지 않아 오류 발생할 가능성이 있음.
✅ 해결 방법: JSX를 반환해야 함.
function MyComponent() {
return <h1>Hello</h1>;
}
5️⃣ Promise
반환 (오류 발생)
function MyComponent() {
return Promise.resolve(<h1>Hello</h1>); // ❌ 오류 발생 (React는 비동기 반환을 허용하지 않음)
}
📌 React는 비동기 반환을 지원하지 않으므로, Promise
객체를 반환하면 오류 발생.
📌 useEffect
와 useState
를 사용하여 비동기 데이터를 처리해야 함.
🔥 결론
🚀 React 컴포넌트가 되려면?
- ✅ 첫 글자가 대문자
- ✅ JSX 또는
null
반환 - ✅
<컴포넌트명 />
형태로 사용 가능해야 함 - 🚨 객체, 함수,
undefined
,Promise
,setTimeout
내부의 JSX 반환 → 오류 발생
✅ 즉, React 컴포넌트의 모든 경우를 고려하여, 오류 없이 렌더링되도록 주의해야 합니다! 😊
'웹 개발 > 프론트엔드 개발' 카테고리의 다른 글
객체와 컴포넌트의 차이 (0) | 2025.02.12 |
---|---|
React의 "재렌더링(Re-rendering)"과 "재조정(Reconciliation)" 개념 정리 (0) | 2025.02.12 |
React 최상위 컴포넌트(`App.js`) 개념 및 데이터 관리 키워드 (0) | 2025.02.12 |
React - 부모 컴포넌트와 자식 컴포넌트 (0) | 2025.02.12 |
React의 `state`(상태)와 `props`(프로퍼티) (0) | 2025.02.12 |