Props
환영 배너용 Greeting 컴포넌트를 만들고 있는데, 로그인한 모든 방문자가 고정된 이름 하나가 아닌 자신의 이름을 봐야 한다고 생각해 봅시다. 고정된 값 하나만 렌더링할 수 있는 컴포넌트로는 이것을 할 수 없습니다. Props(속성의 약자)는 컴포넌트 외부에서 컴포넌트로 데이터를 전달하는 방법입니다. 함수에 인자를 전달하는 것과 같은 방식입니다. Props는 HTML 태그의 속성처럼 컴포넌트에 작성하며, 컴포넌트는 매개변수 하나를 통해 Props를 읽습니다.
function Greeting({ name }) {
return <h1>Hello, {name}</h1>
}
// 사용: <Greeting name="Ada" />Greeting은 name이라는 prop 하나를 받습니다. React는 <Greeting>에 작성한 모든 속성을 단일 객체로 모아서 그 객체를 컴포넌트의 첫 번째 인자로 전달합니다. 여기서 { name }은 그 객체를 구조 분해하여 name 값을 바로 꺼내는 것입니다. <Greeting name="Ada" />라고 호출하면 함수 내부에서 name은 "Ada"입니다. 다른 이름으로 다시 호출하면 같은 컴포넌트에서 다른 제목이 나옵니다.
Props는 한 방향으로 흐릅니다. 컴포넌트가 사용되는 곳에서 컴포넌트 내부로 내려갑니다. Greeting 내부에서 name은 일반 변수처럼 동작하지만, 컴포넌트는 이를 변경할 수 없습니다. Props는 읽기 전용입니다. 컴포넌트가 시간에 따라 변하는 데이터가 필요하다면, 그것은 state의 역할이며 몇 장 뒤에서 다룹니다.
기본값
Props가 없을 수 있다면, 함수 매개변수에 기본값을 주는 것처럼 구조 분해 패턴에서 =를 사용해서 기본값을 설정합니다.
function Greeting({ name = 'friend' }) {
return <h1>Hello, {name}</h1>
}name prop 없이 <Greeting />을 호출하면 name은 'friend'로 돌아갑니다. name을 전달하면 기본값을 덮어씁니다. 이는 일반적인 JavaScript 기본 매개변수 문법으로, React가 컴포넌트에 전달하는 객체에 적용합니다.
children prop
일부 컴포넌트는 속성을 통해 받는 대신 다른 콘텐츠를 감싸야 합니다. 컴포넌트의 여는 태그와 닫는 태그 사이에 콘텐츠를 작성하면, React는 이를 children이라는 특수 prop으로 자동 전달합니다.
function Card({ children }) {
return <div className="card">{children}</div>
}
// 사용:
// <Card>
// <p>여기에 오는 모든 것이 Card의 children prop이 됩니다.</p>
// </Card>children은 다른 prop과 정확히 같게 작동합니다. 같은 구조 분해 매개변수를 통해 읽으며, 컴포넌트가 렌더링할 위치를 결정합니다. 유일한 차이는 도착 방식으로, 이름 있는 속성이 아닌 태그의 콘텐츠를 통해 전달됩니다.
모든 JavaScript 값 전달하기
Prop은 숫자, 불린, 객체, 배열, 심지어 함수까지 모든 JavaScript 값을 가질 수 있습니다. 따옴표 대신 중괄호로 값을 감싸세요.
function UserCard({ user, onSelect }) {
return <button onClick={() => onSelect(user.id)}>{user.name}</button>
}
// 사용: <UserCard user={{ id: 1, name: 'Ada' }} onSelect={handleSelect} />여기서 user는 객체이고, onSelect는 컴포넌트가 호출할 수 있도록 전달된 함수입니다. 버튼의 onClick은 누군가 클릭할 때 onSelect를 실행합니다. 이는 다음 Events 장에서 전체적으로 다루는 이벤트 핸들러입니다. 지금은 그대로 받아들이세요. 이것이 컴포넌트가 통신하는 방식입니다. 데이터는 Props를 통해 아래로 흐르고, 동작도 같은 방식으로 흐르며, 자식이 호출할 수 있는 함수로 전달됩니다.
Props는 컴포넌트 외부에서 컴포넌트로 데이터를 가져옵니다. 몇 장 뒤에 state에서는 컴포넌트가 시간에 따라 자신의 데이터를 어떻게 유지하고 업데이트하는지 다룹니다.
{ name }처럼 구조 분해 매개변수에서 읽으며, 컴포넌트는 전달받은 Props를 변경하지 않습니다. 없을 수 있는 것에는 =로 기본값을 주고, 컴포넌트의 태그 사이에 넣은 모든 것은 children prop으로 전달된다는 것을 기억하세요. 다음: Lists and keys, 여기서는 하나의 컴포넌트가 전체 배열 데이터를 렌더링합니다.

