[ 요약 ]
- props는
JSX 태그에 전달하는 정보
로, 사용자 정의 컴포넌트에는 모든 Javascript 값 전달 가능- React 컴포넌트는
props 객체
를 유일한 인자로 받으며, 구조 분해 할당하여 사용- 모든 props를 자식 컴포넌트에 넘길 경우
JSX spread 문법
사용 (과도한 사용 ❌)- 부모 컴포넌트는
children
을 props로 받아 중첩된 컨텐츠 표현- Props는
읽기 전용 스냅샷
으로, 렌더링 할 때마다 새로운 버전의 props를 받음- Props는 변경할 수 없으므로 상호작용이 필요한 경우 state 사용
학습 내용
- 컴포넌트에 props를 전달하는 방법
- 컴포넌트에서 props를 읽는 방법
- props의 기본값을 지정하는 방법
- 컴포넌트에 JSX를 전달하는 방법
- 시간에 따라 props가 변하는 방식
props
: JSX 태그에 전달하는 정보
<img>
태그에 전달할 수 있는 props는 미리 정의되어 있음 (HTML 표준)
사용자 정의 컴포넌트에는 모든 props 전달 가능
function Avatar() {
return (
<img
className="avatar"
src="https://i.imgur.com/1bX5QH6.jpg"
alt="Lin Lanying"
width={100}
height={100}
/>
);
}
export default function Profile() {
return (
<Avatar />
);
}
다음 두 단계에 걸쳐 Avatar
에 props 전달
- 자식 컴포넌트에 props 전달하기
- 자식 컴포넌트 내부에서 props 읽기
export default function Profile() {
return (
<Avatar
person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }}
size={100}
/>
);
}
person=
뒤에 있는 이중 괄호가 혼란스럽다면, JSX 중괄호 안의 객체로 기억
컴포넌트의 인자로 prop을 읽을 수 있음
function Avatar({ person, size }) {
// person과 size는 이곳에서 사용가능합니다.
}
props를 사용하면 부모 컴포넌트와 자식 컴포넌트를 독립적으로 생각 가능
props는 함수의 인수와 동일한 역할
React 컴포넌트 함수는 유일한 인자로 props 객체
를 받음
보통은 전체 props 자체를 필요로 하지는 않기에, 개별 props로 구조 분해 할당
function Avatar(props) {
let person = props.person;
let size = props.size;
// ...
}
값이 지정되지 않았을 때 변수 바로 뒤에 기본값
을 넣어 구조 분해 할당 가능
이 기본값은 size prop이 없거나 size={undefined}
→ 기본값 사용 ✅
그러나 **size={null}
또는 size={0}
→ 기본값 사용 ❌**
function Avatar({ person, size = 100 }) {
// ...
}
때때로 전달되는 props는 반복적
function Profile({ person, size, isSepia, thickBorder }) {
return (
<div className="card">
<Avatar
person={person}
size={size}
isSepia={isSepia}
thickBorder={thickBorder}
/>
</div>
);
}
반복적인 코드는 가독성을 높일 수 있지만, 간결함이 중요할 때 ...
사용
일부 컴포넌트는 모든 props를 자식 컴포넌트에 전달
function Profile(props) {
return (
<div className="card">
**<Avatar {...props} />**
</div>
);
}
spread 문법은 제한적으로 사용
JSX 태그 내에 콘텐츠 중첩 → 부모 컴포넌트는 해당 콘텐츠를 children
이라는 prop 요소로 받음
부모 컴포넌트가 임의의 JSX로 채울 수 있는 구멍
이 있는 것
패널, 그리드 등의 시각적 래퍼에 종종 사용
import Avatar from './Avatar.js';
**function Card({ children }) {**
return (
<div className="card">
{children}
</div>
);
}
export default function Profile() {
return (
<Card>
<Avatar
size={100}
person={{
name: 'Katsuko Saruhashi',
imageId: 'YfeOqp2'
}}
/>
</Card>
);
}
부모 컴포넌트로부터 두 가지 props를 받음
컴포넌트가 시간에 따라 다른 props를 받을 수 있음
props 항상 고정 ❌
export default function Clock({ color, time }) {
return (
<h1 style={{ color: color }}>
{time}
</h1>
);
}
props는 컴포넌트의 데이터를 처음에만 반영하는 것이 아니라 모든 시점에 반영
props를 변경해야 하는 경우 새로운 객체를 전달하도록 요청
이전의 props는 버려지고, 자바스크립트 엔진은 기존 props가 차지했던 메모리 회수
⇒ props 변경 시도 ❌