156 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			156 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								id: 5a24c314108439a4d4036184
							 | 
						||
| 
								 | 
							
								title: Render with an If-Else Condition
							 | 
						||
| 
								 | 
							
								challengeType: 6
							 | 
						||
| 
								 | 
							
								forumTopicId: 301410
							 | 
						||
| 
								 | 
							
								dashedName: render-with-an-if-else-condition
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --description--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Another application of using JavaScript to control your rendered view is to tie the elements that are rendered to a condition. When the condition is true, one view renders. When it's false, it's a different view. You can do this with a standard `if/else` statement in the `render()` method of a React component.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --instructions--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MyComponent contains a `boolean` in its state which tracks whether you want to display some element in the UI or not. The `button` toggles the state of this value. Currently, it renders the same UI every time. Rewrite the `render()` method with an `if/else` statement so that if `display` is `true`, you return the current markup. Otherwise, return the markup without the `h1` element.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								**Note:** You must write an `if/else` to pass the tests. Use of the ternary operator will not pass here.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --hints--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`MyComponent` should exist and render.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert(
							 | 
						||
| 
								 | 
							
								  (function () {
							 | 
						||
| 
								 | 
							
								    const mockedComponent = Enzyme.mount(React.createElement(MyComponent));
							 | 
						||
| 
								 | 
							
								    return mockedComponent.find('MyComponent').length === 1;
							 | 
						||
| 
								 | 
							
								  })()
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When `display` is set to `true`, a `div`, `button`, and `h1` should render.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								async () => {
							 | 
						||
| 
								 | 
							
								  const waitForIt = (fn) =>
							 | 
						||
| 
								 | 
							
								    new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250));
							 | 
						||
| 
								 | 
							
								  const mockedComponent = Enzyme.mount(React.createElement(MyComponent));
							 | 
						||
| 
								 | 
							
								  const state_1 = () => {
							 | 
						||
| 
								 | 
							
								    mockedComponent.setState({ display: true });
							 | 
						||
| 
								 | 
							
								    return waitForIt(() => mockedComponent);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  const updated = await state_1();
							 | 
						||
| 
								 | 
							
								  assert(
							 | 
						||
| 
								 | 
							
								    mockedComponent.find('div').length === 1 &&
							 | 
						||
| 
								 | 
							
								      mockedComponent.find('div').children().length === 2 &&
							 | 
						||
| 
								 | 
							
								      mockedComponent.find('button').length === 1 &&
							 | 
						||
| 
								 | 
							
								      mockedComponent.find('h1').length === 1
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When `display` is set to `false`, only a `div` and `button` should render.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								async () => {
							 | 
						||
| 
								 | 
							
								  const waitForIt = (fn) =>
							 | 
						||
| 
								 | 
							
								    new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250));
							 | 
						||
| 
								 | 
							
								  const mockedComponent = Enzyme.mount(React.createElement(MyComponent));
							 | 
						||
| 
								 | 
							
								  const state_1 = () => {
							 | 
						||
| 
								 | 
							
								    mockedComponent.setState({ display: false });
							 | 
						||
| 
								 | 
							
								    return waitForIt(() => mockedComponent);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  const updated = await state_1();
							 | 
						||
| 
								 | 
							
								  assert(
							 | 
						||
| 
								 | 
							
								    mockedComponent.find('div').length === 1 &&
							 | 
						||
| 
								 | 
							
								      mockedComponent.find('div').children().length === 1 &&
							 | 
						||
| 
								 | 
							
								      mockedComponent.find('button').length === 1 &&
							 | 
						||
| 
								 | 
							
								      mockedComponent.find('h1').length === 0
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The render method should use an `if/else` statement to check the condition of `this.state.display`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								(getUserInput) =>
							 | 
						||
| 
								 | 
							
								  assert(
							 | 
						||
| 
								 | 
							
								    getUserInput('index').includes('if') &&
							 | 
						||
| 
								 | 
							
								      getUserInput('index').includes('else')
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --seed--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## --after-user-code--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```jsx
							 | 
						||
| 
								 | 
							
								ReactDOM.render(<MyComponent />, document.getElementById('root'))
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## --seed-contents--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```jsx
							 | 
						||
| 
								 | 
							
								class MyComponent extends React.Component {
							 | 
						||
| 
								 | 
							
								  constructor(props) {
							 | 
						||
| 
								 | 
							
								    super(props);
							 | 
						||
| 
								 | 
							
								    this.state = {
							 | 
						||
| 
								 | 
							
								      display: true
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.toggleDisplay = this.toggleDisplay.bind(this);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  toggleDisplay() {
							 | 
						||
| 
								 | 
							
								    this.setState((state) => ({
							 | 
						||
| 
								 | 
							
								      display: !state.display
							 | 
						||
| 
								 | 
							
								    }));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  render() {
							 | 
						||
| 
								 | 
							
								    // Change code below this line
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return (
							 | 
						||
| 
								 | 
							
								       <div>
							 | 
						||
| 
								 | 
							
								         <button onClick={this.toggleDisplay}>Toggle Display</button>
							 | 
						||
| 
								 | 
							
								         <h1>Displayed!</h1>
							 | 
						||
| 
								 | 
							
								       </div>
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --solutions--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```jsx
							 | 
						||
| 
								 | 
							
								class MyComponent extends React.Component {
							 | 
						||
| 
								 | 
							
								  constructor(props) {
							 | 
						||
| 
								 | 
							
								    super(props);
							 | 
						||
| 
								 | 
							
								    this.state = {
							 | 
						||
| 
								 | 
							
								      display: true
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								 this.toggleDisplay = this.toggleDisplay.bind(this);
							 | 
						||
| 
								 | 
							
								 }
							 | 
						||
| 
								 | 
							
								  toggleDisplay() {
							 | 
						||
| 
								 | 
							
								    this.setState((state) => ({
							 | 
						||
| 
								 | 
							
								      display: !state.display
							 | 
						||
| 
								 | 
							
								    }));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  render() {
							 | 
						||
| 
								 | 
							
								    // Change code below this line
							 | 
						||
| 
								 | 
							
								    if (this.state.display) {
							 | 
						||
| 
								 | 
							
								      return (
							 | 
						||
| 
								 | 
							
								         <div>
							 | 
						||
| 
								 | 
							
								           <button onClick={this.toggleDisplay}>Toggle Display</button>
							 | 
						||
| 
								 | 
							
								           <h1>Displayed!</h1>
							 | 
						||
| 
								 | 
							
								         </div>
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return (
							 | 
						||
| 
								 | 
							
								        <div>
							 | 
						||
| 
								 | 
							
								           <button onClick={this.toggleDisplay}>Toggle Display</button>
							 | 
						||
| 
								 | 
							
								         </div>
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								```
							 |