135 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| id: 5a24c314108439a4d4036164
 | |
| title: Create a Component with Composition
 | |
| challengeType: 6
 | |
| forumTopicId: 301383
 | |
| dashedName: create-a-component-with-composition
 | |
| ---
 | |
| 
 | |
| # --description--
 | |
| 
 | |
| Now we will look at how we can compose multiple React components together. Imagine you are building an App and have created three components, a `Navbar`, `Dashboard`, and `Footer`.
 | |
| 
 | |
| To compose these components together, you could create an `App` *parent* component which renders each of these three components as *children*. To render a component as a child in a React component, you include the component name written as a custom HTML tag in the JSX. For example, in the `render` method you could write:
 | |
| 
 | |
| ```jsx
 | |
| return (
 | |
|  <App>
 | |
|   <Navbar />
 | |
|   <Dashboard />
 | |
|   <Footer />
 | |
|  </App>
 | |
| )
 | |
| ```
 | |
| 
 | |
| When React encounters a custom HTML tag that references another component (a component name wrapped in `< />` like in this example), it renders the markup for that component in the location of the tag. This should illustrate the parent/child relationship between the `App` component and the `Navbar`, `Dashboard`, and `Footer`.
 | |
| 
 | |
| # --instructions--
 | |
| 
 | |
| In the code editor, there is a simple functional component called `ChildComponent` and a class component called `ParentComponent`. Compose the two together by rendering the `ChildComponent` within the `ParentComponent`. Make sure to close the `ChildComponent` tag with a forward slash.
 | |
| 
 | |
| **Note:** `ChildComponent` is defined with an ES6 arrow function because this is a very common practice when using React. However, know that this is just a function. If you aren't familiar with the arrow function syntax, please refer to the JavaScript section.
 | |
| 
 | |
| # --hints--
 | |
| 
 | |
| The React component should return a single `div` element.
 | |
| 
 | |
| ```js
 | |
| assert(
 | |
|   (function () {
 | |
|     var shallowRender = Enzyme.shallow(React.createElement(ParentComponent));
 | |
|     return shallowRender.type() === 'div';
 | |
|   })()
 | |
| );
 | |
| ```
 | |
| 
 | |
| The component should return two nested elements.
 | |
| 
 | |
| ```js
 | |
| assert(
 | |
|   (function () {
 | |
|     var shallowRender = Enzyme.shallow(React.createElement(ParentComponent));
 | |
|     return shallowRender.children().length === 2;
 | |
|   })()
 | |
| );
 | |
| ```
 | |
| 
 | |
| The component should return the ChildComponent as its second child.
 | |
| 
 | |
| ```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>
 | |
|     );
 | |
|   }
 | |
| };
 | |
| ```
 |