[React]Nested Components와 Props

Edit

[React]Nested Components와 Props

이전 포스트에서 React component를 만드는 방법을 알아보았다. 이번 글에서는 component를 nested(중첩) 시키는 방법과 자식 React component에 데이터를 전달하는 방법에 대해 알아보자.

이전부터 쭉 말해왔지만 React의 가장 큰 장점은 state를 관리하는 것이 정말 쉽다는 것이다. 그 예로 한 component에서 다른 하위 component로 데이터를 쉽게 전달하는 시스템이 있고 그 시스템이 바로 props이다. props는 component에 어떤 인수가 function에 연결되어 있는지 나타내 주는 놈이다.

다음은 props를 사용하는 아주 기본적인 예이다.

var HelloUser = React.createClass({
render: function(){
return (
<div> Hello, {this.props.name}div>
)

}
});
ReactDOM.render(<HelloUser name="Tyler"/>, document.getElementById('app'));

위의 코드를 보면 component를 호출할 때 name(Tyler)을 전달한다. 이 속성은 component 내에서 this.props.name으로 불러올 수 있다.

조금 더 복잡한 경우를 생각해보자. 위 예제는 component가 하나였다면 이번에는 두 개의 component에 대해 다루어보자.각각의 component는 부모 component, 자식(하위) component이며, 부모 component는 자식 component에게 props으로 데이터를 전달한다. 먼저 부모 component를 보자.

var FriendsContainer = React.createClass({
render: function(){
var name = 'Jaewon Kwon'
var friends = ['friend1', 'friend2', 'friend3']
return (
<div>
<h3> Name: {name} h3>

<ShowList names={friends} />
div>

)
}
});

이번에는 자식 Component이다.

var ShowList = React.createClass({
render: function(){
var listItems = this.props.names.map(function(friend){
return <li> {friend} li>;

});
return (
<div>
<h3> Friends h3>

<ul>
{listItems}
ul>
div>
)
}
});

Array.prototype.map가 익숙하지 않다면, 위의 예제가 조금 어색해 보일 수 있다. map은 새로운 배열을 만들고, 배열의 각 항목에 콜백 함수를 호출하여, 각 배열에 콜백 함수를 호출 한 결과로 새 배열에 채운다. 예를 들면

var friends = ['friend1', 'friend2', 'friend3'];
var listItems = friends.map(function(friend){
return "
  • " + friend + "
  • "
    ;
    });
    console.log(listItems); // ["
  • friend1
  • ", "
  • friend2
  • ", "
  • friend3
  • "];

    위의 결과로 새로운 배열 안에 원래 배열의 각 이름들이

  • 안에 추가가 되었다. 이런 점 때문에 map은 React에 딱 어울리는 함수이다. 자식 component에서 이름을 매핑하고 각 이름을 한 쌍의
  • 태그로 묶어 listItems 변수에 저장한다. 그런 다음 render 메소드는 모든 친구들의 목록을 반환한다.

  • %23%23%23%5BReact%5DNested%20Components%uC640%20Props%0A@%28React%29%5Breact%2C%20nest%2C%20component%2C%20props%5D%0A%0A%5B%uC774%uC804%20%uD3EC%uC2A4%uD2B8%5D%28http%3A//genius-project.postach.io/post/react-reactyi-componente-daehayeo%29%uC5D0%uC11C%20React%20**component**%uB97C%20%uB9CC%uB4DC%uB294%20%uBC29%uBC95%uC744%20%uC54C%uC544%uBCF4%uC558%uB2E4.%20%uC774%uBC88%20%uAE00%uC5D0%uC11C%uB294%20component%uB97C%20**nested**%28%uC911%uCCA9%29%20%uC2DC%uD0A4%uB294%20%uBC29%uBC95%uACFC%20%uC790%uC2DD%20React%20component%uC5D0%20%uB370%uC774%uD130%uB97C%20%uC804%uB2EC%uD558%uB294%20%uBC29%uBC95%uC5D0%20%uB300%uD574%20%uC54C%uC544%uBCF4%uC790.%0A%0A%uC774%uC804%uBD80%uD130%20%uCB49%20%uB9D0%uD574%uC654%uC9C0%uB9CC%20React%uC758%20%uAC00%uC7A5%20%uD070%20%uC7A5%uC810%uC740%20**state**%uB97C%20%uAD00%uB9AC%uD558%uB294%20%uAC83%uC774%20%uC815%uB9D0%20%uC27D%uB2E4%uB294%20%uAC83%uC774%uB2E4.%20%uADF8%20%uC608%uB85C%20%uD55C%20component%uC5D0%uC11C%20%uB2E4%uB978%20%uD558%uC704%20component%uB85C%20%uB370%uC774%uD130%uB97C%20%uC27D%uAC8C%20%uC804%uB2EC%uD558%uB294%20%uC2DC%uC2A4%uD15C%uC774%20%uC788%uACE0%20%uADF8%20%uC2DC%uC2A4%uD15C%uC774%20%uBC14%uB85C%20**props**%uC774%uB2E4.%20**props**%uB294%20component%uC5D0%20%uC5B4%uB5A4%20%uC778%uC218%uAC00%20function%uC5D0%20%uC5F0%uACB0%uB418%uC5B4%20%uC788%uB294%uC9C0%20%uB098%uD0C0%uB0B4%20%uC8FC%uB294%20%uB188%uC774%uB2E4.%0A%0A%uB2E4%uC74C%uC740%20**props**%uB97C%20%uC0AC%uC6A9%uD558%uB294%20%uC544%uC8FC%20%uAE30%uBCF8%uC801%uC778%20%uC608%uC774%uB2E4.%0A%0A%60%60%60javascript%0Avar%20HelloUser%20%3D%20React.createClass%28%7B%0A%20%20render%3A%20function%28%29%7B%0A%20%20%20%20return%20%28%0A%20%20%20%20%20%20%3Cdiv%3E%20Hello%2C%20%7Bthis.props.name%7D%3C/div%3E%0A%20%20%20%20%29%0A%20%20%7D%0A%7D%29%3B%0AReactDOM.render%28%3CHelloUser%20name%3D%22Tyler%22/%3E%2C%20document.getElementById%28%27app%27%29%29%3B%0A%60%60%60%0A%0A%uC704%uC758%20%uCF54%uB4DC%uB97C%20%uBCF4%uBA74%20**component**%uB97C%20%uD638%uCD9C%uD560%20%uB54C%20**name**%28Tyler%29%uC744%20%uC804%uB2EC%uD55C%uB2E4.%20%uC774%20%uC18D%uC131%uC740%20component%20%uB0B4%uC5D0%uC11C%20%60this.props.name%60%uC73C%uB85C%20%uBD88%uB7EC%uC62C%20%uC218%20%uC788%uB2E4.%0A%0A%uC870%uAE08%20%uB354%20%uBCF5%uC7A1%uD55C%20%uACBD%uC6B0%uB97C%20%uC0DD%uAC01%uD574%uBCF4%uC790.%20%uC704%20%uC608%uC81C%uB294%20component%uAC00%20%uD558%uB098%uC600%uB2E4%uBA74%20%uC774%uBC88%uC5D0%uB294%20%uB450%20%uAC1C%uC758%20component%uC5D0%20%uB300%uD574%20%uB2E4%uB8E8%uC5B4%uBCF4%uC790.%uAC01%uAC01%uC758%20component%uB294%20%uBD80%uBAA8%20component%2C%20%uC790%uC2DD%28%uD558%uC704%29%20component%uC774%uBA70%2C%20%uBD80%uBAA8%20component%uB294%20%uC790%uC2DD%20component%uC5D0%uAC8C%20**props**%uC73C%uB85C%20%uB370%uC774%uD130%uB97C%20%uC804%uB2EC%uD55C%uB2E4.%20%uBA3C%uC800%20**%uBD80%uBAA8%20component**%uB97C%20%uBCF4%uC790.%0A%60%60%60javascript%0Avar%20FriendsContainer%20%3D%20React.createClass%28%7B%0A%20%20render%3A%20function%28%29%7B%0A%20%20%20%20var%20name%20%3D%20%27Jaewon%20Kwon%27%0A%20%20%20%20var%20friends%20%3D%20%5B%27friend1%27%2C%20%27friend2%27%2C%20%27friend3%27%5D%0A%20%20%20%20return%20%28%0A%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20%3Ch3%3E%20Name%3A%20%7Bname%7D%20%3C/h3%3E%0A%20%20%20%20%20%20%20%20%3CShowList%20names%3D%7Bfriends%7D%20/%3E%0A%20%20%20%20%20%20%3C/div%3E%0A%20%20%20%20%29%0A%20%20%7D%0A%7D%29%3B%0A%60%60%60%0A%0A%uC774%uBC88%uC5D0%uB294%20**%uC790%uC2DD%20Component**%uC774%uB2E4.%0A%0A%60%60%60javascript%0Avar%20ShowList%20%3D%20React.createClass%28%7B%0A%20%20render%3A%20function%28%29%7B%0A%20%20%20%20var%20listItems%20%3D%20this.props.names.map%28function%28friend%29%7B%0A%20%20%20%20%20%20return%20%3Cli%3E%20%7Bfriend%7D%20%3C/li%3E%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20return%20%28%0A%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20%3Ch3%3E%20Friends%20%3C/h3%3E%0A%20%20%20%20%20%20%20%20%3Cul%3E%0A%20%20%20%20%20%20%20%20%20%20%7BlistItems%7D%0A%20%20%20%20%20%20%20%20%3C/ul%3E%0A%20%20%20%20%20%20%3C/div%3E%0A%20%20%20%20%29%0A%20%20%7D%0A%7D%29%3B%0A%60%60%60%0A%60Array.prototype.map%60%uAC00%20%uC775%uC219%uD558%uC9C0%20%uC54A%uB2E4%uBA74%2C%20%uC704%uC758%20%uC608%uC81C%uAC00%20%uC870%uAE08%20%uC5B4%uC0C9%uD574%20%uBCF4%uC77C%20%uC218%20%uC788%uB2E4.%20%60map%60%uC740%20%uC0C8%uB85C%uC6B4%20%uBC30%uC5F4%uC744%20%uB9CC%uB4E4%uACE0%2C%20%uBC30%uC5F4%uC758%20%uAC01%20%uD56D%uBAA9%uC5D0%20%uCF5C%uBC31%20%uD568%uC218%uB97C%20%uD638%uCD9C%uD558%uC5EC%2C%20%uAC01%20%uBC30%uC5F4%uC5D0%20%uCF5C%uBC31%20%uD568%uC218%uB97C%20%uD638%uCD9C%20%uD55C%20%uACB0%uACFC%uB85C%20%uC0C8%20%uBC30%uC5F4%uC5D0%20%uCC44%uC6B4%uB2E4.%20%uC608%uB97C%20%uB4E4%uBA74%0A%0A%60%60%60javascript%0Avar%20friends%20%3D%20%5B%27friend1%27%2C%20%27friend2%27%2C%20%27friend3%27%5D%3B%0Avar%20listItems%20%3D%20friends.map%28function%28friend%29%7B%0A%20%20return%20%22%3Cli%3E%20%22%20+%20friend%20+%20%22%3C/li%3E%22%3B%0A%7D%29%3B%0Aconsole.log%28listItems%29%3B%20//%20%5B%22%3Cli%3E%20friend1%20%3C/li%3E%22%2C%20%22%3Cli%3E%20friend2%3C/li%3E%22%2C%20%22%3Cli%3E%20friend3%20%3C/li%3E%22%5D%3B%0A%60%60%60%0A%0A%uC704%uC758%20%uACB0%uACFC%uB85C%20%uC0C8%uB85C%uC6B4%20%uBC30%uC5F4%20%uC548%uC5D0%20%20%uC6D0%uB798%20%uBC30%uC5F4%uC758%20%uAC01%20%uC774%uB984%uB4E4%uC774%20%60%3Cli%3E%20%3C/%20li%3E%60%20%uC548%uC5D0%20%uCD94%uAC00%uAC00%20%uB418%uC5C8%uB2E4.%20%uC774%uB7F0%20%uC810%20%uB54C%uBB38%uC5D0%20%60map%60%uC740%20React%uC5D0%20%uB531%20%uC5B4%uC6B8%uB9AC%uB294%20%uD568%uC218%uC774%uB2E4.%20%uC790%uC2DD%20component%uC5D0%uC11C%20%uC774%uB984%uC744%20%uB9E4%uD551%uD558%uACE0%20%uAC01%20%uC774%uB984%uC744%20%uD55C%20%uC30D%uC758%20%60%3Cli%3E%60%20%uD0DC%uADF8%uB85C%20%uBB36%uC5B4%20%60listItems%60%20%uBCC0%uC218%uC5D0%20%uC800%uC7A5%uD55C%uB2E4.%20%uADF8%uB7F0%20%uB2E4%uC74C%20%20%60render%60%20%uBA54%uC18C%uB4DC%uB294%20%uBAA8%uB4E0%20%uCE5C%uAD6C%uB4E4%uC758%20%uBAA9%uB85D%uC744%20%uBC18%uD658%uD55C%uB2E4.