
📦 컴포넌트 안에서 렌더링 책임을 외부(부모)로 넘기는 기법
-> 즉, 로직은 이 컴포넌트가 관리하고, UI는 다른 녀석이 알아서 하는 패턴
➡️ 마우스 위치를 추적하는 컴포넌트
// MouseTracker.js
import { useState } from "react";
function MouseTracker({ children }) {
const [position, setPosition] = useState({ x: 0, y: 0 });
const handleMouseMove = (e) => {
setPosition({ x: e.clientX, y: e.clientY });
};
return (
<div style={{ height: "100vh" }} onMouseMove={handleMouseMove}>
{children(position)} {/* <- Render Props */}
</div>
);
}
export default MouseTracker;
➡️ 사용하는 쪽에서는 이렇게 쓴다
<MouseTracker>
{({ x, y }) => (
<h1>Mouse position: {x}, {y}</h1>
)}
</MouseTracker>
설명:
[MouseTracker]
└─ useState (마우스 위치 저장)
└─ onMouseMove 이벤트 핸들링
└─ {children(position)} 호출 → 외부에서 결정하는 렌더링
| 비교 항목 | 일반 Props | Render Props |
|---|---|---|
| 데이터 전달 방법 | 값(value) 또는 JSX 컴포넌트 | 함수(function) 전달 |
| 렌더링 주체 | 컴포넌트 내부에서 정의 | 외부 함수(children)이 정의 |
| 유연성 | 고정된 형태 | 매우 유연 (UI 자유롭게 조립 가능) |