135 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | id: 5a24c314108439a4d4036164 | ||
|  | title: コンポジションを使用してコンポーネントを作成する | ||
|  | challengeType: 6 | ||
|  | forumTopicId: 301383 | ||
|  | dashedName: create-a-component-with-composition | ||
|  | --- | ||
|  | 
 | ||
|  | # --description--
 | ||
|  | 
 | ||
|  | ここでは、複数の React コンポーネントをまとめて作成する方法について説明します。 アプリを作成していて、すでに `Navbar`、`Dashboard`、`Footer` の 3 つのコンポーネントを作成したとします。 | ||
|  | 
 | ||
|  | これら 3 つのコンポーネントを*子*としてレンダーする `App` という*親*コンポーネントを作成することができます。 コンポーネントを React コンポーネント内の子としてレンダーするには、カスタム HTML タグとして記述したコンポーネント名を JSX に含めます。 たとえば、`render` メソッドで次のように記述できます。 | ||
|  | 
 | ||
|  | ```jsx | ||
|  | return ( | ||
|  |  <App> | ||
|  |   <Navbar /> | ||
|  |   <Dashboard /> | ||
|  |   <Footer /> | ||
|  |  </App> | ||
|  | ) | ||
|  | ``` | ||
|  | 
 | ||
|  | React で、別のコンポーネントを参照するカスタム HTML タグが出現すると (この例では `< />` で囲まれたコンポーネント名)、そのコンポーネントのマークアップがタグの場所にレンダーされます。 これにより、`App` コンポーネントと `Navbar`、`Dashboard`、`Footer` との間の親子関係が示されます。 | ||
|  | 
 | ||
|  | # --instructions--
 | ||
|  | 
 | ||
|  | コードエディターに、`ChildComponent` という単純な関数型コンポーネントと、`ParentComponent` というクラスコンポーネントがあります。 `ParentComponent` の中に `ChildComponent` をレンダーして、2 つのコンポーネントをまとめて作成してください。 必ずフォワードスラッシュで `ChildComponent` タグを終了してください。 | ||
|  | 
 | ||
|  | **注:** `ChildComponent` は ES6 のアロー関数で定義されています。これは React を使用するときのごく一般的な記法です。 ただし、これは単なる関数にすぎません。 アロー関数の構文に慣れていない方は、JavaScript のセクションを参照してください。 | ||
|  | 
 | ||
|  | # --hints--
 | ||
|  | 
 | ||
|  | React コンポーネントから単一の `div` 要素を返します。 | ||
|  | 
 | ||
|  | ```js | ||
|  | assert( | ||
|  |   (function () { | ||
|  |     var shallowRender = Enzyme.shallow(React.createElement(ParentComponent)); | ||
|  |     return shallowRender.type() === 'div'; | ||
|  |   })() | ||
|  | ); | ||
|  | ``` | ||
|  | 
 | ||
|  | コンポーネントから 2 つのネストされた要素を返します。 | ||
|  | 
 | ||
|  | ```js | ||
|  | assert( | ||
|  |   (function () { | ||
|  |     var shallowRender = Enzyme.shallow(React.createElement(ParentComponent)); | ||
|  |     return shallowRender.children().length === 2; | ||
|  |   })() | ||
|  | ); | ||
|  | ``` | ||
|  | 
 | ||
|  | コンポーネントから `ChildComponent` を 2 番目の子として返します。 | ||
|  | 
 | ||
|  | ```js | ||
|  | assert( | ||
|  |   (function () { | ||
|  |     const mockedComponent = Enzyme.mount(React.createElement(ParentComponent)); | ||
|  |     return ( | ||
|  |       mockedComponent.find('ParentComponent').find('ChildComponent').length === | ||
|  |       1 | ||
|  |     ); | ||
|  |   })() | ||
|  | ); | ||
|  | ``` | ||
|  | 
 | ||
|  | # --seed--
 | ||
|  | 
 | ||
|  | ## --after-user-code--
 | ||
|  | 
 | ||
|  | ```jsx | ||
|  | ReactDOM.render(<ParentComponent />, document.getElementById('root')) | ||
|  | ``` | ||
|  | 
 | ||
|  | ## --seed-contents--
 | ||
|  | 
 | ||
|  | ```jsx | ||
|  | const ChildComponent = () => { | ||
|  |   return ( | ||
|  |     <div> | ||
|  |       <p>I am the child</p> | ||
|  |     </div> | ||
|  |   ); | ||
|  | }; | ||
|  | 
 | ||
|  | class ParentComponent extends React.Component { | ||
|  |   constructor(props) { | ||
|  |     super(props); | ||
|  |   } | ||
|  |   render() { | ||
|  |     return ( | ||
|  |       <div> | ||
|  |         <h1>I am the parent</h1> | ||
|  |         { /* Change code below this line */ } | ||
|  | 
 | ||
|  | 
 | ||
|  |         { /* Change code above this line */ } | ||
|  |       </div> | ||
|  |     ); | ||
|  |   } | ||
|  | }; | ||
|  | ``` | ||
|  | 
 | ||
|  | # --solutions--
 | ||
|  | 
 | ||
|  | ```jsx | ||
|  | const ChildComponent = () => { | ||
|  |   return ( | ||
|  |     <div> | ||
|  |       <p>I am the child</p> | ||
|  |     </div> | ||
|  |   ); | ||
|  | }; | ||
|  | 
 | ||
|  | class ParentComponent extends React.Component { | ||
|  |   constructor(props) { | ||
|  |     super(props); | ||
|  |   } | ||
|  |   render() { | ||
|  |     return ( | ||
|  |       <div> | ||
|  |         <h1>I am the parent</h1> | ||
|  |         { /* Change code below this line */ } | ||
|  |         <ChildComponent /> | ||
|  |         { /* Change code above this line */ } | ||
|  |       </div> | ||
|  |     ); | ||
|  |   } | ||
|  | }; | ||
|  | ``` |