props.children 관련 예제를 풀다가 의문이 생겼다.
분명히 자식 컴포넌트 2개를 부모 컴포넌트안에 넣었는데 view에 왜 보이지 않을까?
import React from 'react';
//style속성을 가진 div엘리먼트를 반환하는 컴포넌트.
function Wrapper() {
const style = {
border: '2px solid black',
padding: '16px',
};
return (
<div style={style}>
</div>
)
}
export default Wrapper;
이를 App.js에 넣어서 자식 컴포넌트인 Hello들을 감싸고자 한다.
import React from 'react';
import Hello from './Hello';
import Wrapper from './Wrapper';
function App() {
return (
<Wrapper>
<Hello name="react" color="red"/>
<Hello color="pink"/>
</Wrapper>
);
}
export default App;
그러나 Hello 컴포넌트 안에 작성한 내용들이 보이지 않는다.
안의 component들의 인식을 할수없는걸까? 해서 개발자 도구를 확인해보니

그림 01) 자식 컴포넌트의 값이 전달되지 않아 암것도 없는 view
children 속성안에 배열로 잘 들어가있는것은 확인할 수 있었다.
그렇다면, 내부의 내용이 DOM에 렌더링이 되지 않았다는 것일까?
이를 해결하려면, 부모 컴포넌트 Wrapper에서, props.children을 렌더링 해줘야 한다.
즉, props로 전달받은 Hello 컴포넌트를 내부에서 사용할 때에는 children으로 접근해줘야 하는것이다.
import React from 'react';
function Wrapper({ children }) {
const style = {
border: '2px solid black',
padding: '16px',
};
return (
<div style={style}>
{children}
</div>
)
}
export default Wrapper;
Wrapper.js에 props로 자식 컴포넌트의 값을 전달한 후 바뀐 뷰를 살펴보니 정상적으로 Hello 컴포넌트의 내용이 출력되어있는걸 확인했다. 물론 개발자도구의 component에도 자식 컴포넌트의 값이 전달된것을 확인했다.

그림 02) 내용이 출력된 모습
: 컴포넌트 태그 사이에 넣은 모든 값(문자열, 자식 엘리먼트 등..)을 전달할 수 있다.
즉, 호출할 때에 여는 태그와 닫는 태그 사이에 포함된 내용을 표시하는데에 사용된다.
- React 공식문서의 주요 개념 중 '합성 vs 상속' 을 보면,
"어떤 컴포넌트들은 어떤 자식 엘리먼트가 들어올 지 미리 예상할 수 없는 경우가 있습니다."
라고 되어있다. 즉, 직접 자식을 사용하기에 어려운 상황들이 존재한다는 것이다.
이런 경우에서, 같은 레이아웃 안에 다른 내용을 보여줘야 할 경우, children을 사용하면
효율적인 컴포넌트의 재사용을 할 수 있다.