--- id: 5a24c314108439a4d4036176 title: Use State to Toggle an Element challengeType: 6 isRequired: false --- ## Description
You can use state in React applications in more complex ways than what you've seen so far. One example is to monitor the status of a value, then render the UI conditionally based on this value. There are several different ways to accomplish this, and the code editor shows one method.
## Instructions
MyComponent has a visibility property which is initialized to false. The render method returns one view if the value of visibility is true, and a different view if it is false. Currently, there is no way of updating the visibility property in the component's state. The value should toggle back and forth between true and false. There is a click handler on the button which triggers a class method called toggleVisibility(). Define this method so the state of visibility toggles to the opposite value when the method is called. If visibility is false, the method sets it to true, and vice versa. Finally, click the button to see the conditional rendering of the component based on its state. Hint: Don't forget to bind the this keyword to the method in the constructor!
## Tests
```yml tests: - text: MyComponent should return a div element which contains a button. testString: assert.strictEqual(Enzyme.mount(React.createElement(MyComponent)).find('div').find('button').length, 1, 'MyComponent should return a div element which contains a button.'); - text: The state of MyComponent should initialize with a visibility property set to false. testString: assert.strictEqual(Enzyme.mount(React.createElement(MyComponent)).state('visibility'), false, 'The state of MyComponent should initialize with a visibility property set to false.'); - text: Clicking the button element should toggle the visibility property in state between true and false. testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const mockedComponent = Enzyme.mount(React.createElement(MyComponent)); const first = () => { mockedComponent.setState({ visibility: false }); return waitForIt(() => mockedComponent.state(''visibility'')); }; const second = () => { mockedComponent.find(''button'').simulate(''click''); return waitForIt(() => mockedComponent.state(''visibility'')); }; const third = () => { mockedComponent.find(''button'').simulate(''click''); return waitForIt(() => mockedComponent.state(''visibility'')); }; const firstValue = await first(); const secondValue = await second(); const thirdValue = await third(); assert(!firstValue && secondValue && !thirdValue, ''Clicking the button element should toggle the visibility property in state between true and false.''); }; ' ```
## Challenge Seed
```jsx class MyComponent extends React.Component { constructor(props) { super(props); this.state = { visibility: false }; // change code below this line // change code above this line } // change code below this line // change code above this line render() { if (this.state.visibility) { return (

Now you see me!

); } else { return (
); } } }; ```
### After Test
```js ReactDOM.render(, document.getElementById('root')) ```
## Solution
```js class MyComponent extends React.Component { constructor(props) { super(props); this.state = { visibility: false }; this.toggleVisibility = this.toggleVisibility.bind(this); } toggleVisibility() { this.setState({ visibility: !this.state.visibility }); } render() { if (this.state.visibility) { return (

Now you see me!

); } else { return (
); } } }; ```