* chore(learn): audit bootstrap * chore(learn): audit FE projects * chore(learn): audit jQuery * chore(learn): audit React * chore(learn): audit react-redux * chore(learn): audit redux * chore(learn): audit sass * fix: apply review suggestions Co-authored-by: Randell Dawson <5313213+RandellDawson@users.noreply.github.com> * fix: apply non-suggestions * chore: remove comments from code Co-authored-by: Randell Dawson <5313213+RandellDawson@users.noreply.github.com>
		
			
				
	
	
		
			147 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| id: 5a24c314108439a4d4036177
 | |
| title: Write a Simple Counter
 | |
| challengeType: 6
 | |
| forumTopicId: 301425
 | |
| dashedName: write-a-simple-counter
 | |
| ---
 | |
| 
 | |
| # --description--
 | |
| 
 | |
| You can design a more complex stateful component by combining the concepts covered so far. These include initializing `state`, writing methods that set `state`, and assigning click handlers to trigger these methods.
 | |
| 
 | |
| # --instructions--
 | |
| 
 | |
| The `Counter` component keeps track of a `count` value in `state`. There are two buttons which call methods `increment()` and `decrement()`. Write these methods so the counter value is incremented or decremented by 1 when the appropriate button is clicked. Also, create a `reset()` method so when the reset button is clicked, the count is set to 0.
 | |
| 
 | |
| **Note:** Make sure you don't modify the `className`s of the buttons. Also, remember to add the necessary bindings for the newly-created methods in the constructor.
 | |
| 
 | |
| # --hints--
 | |
| 
 | |
| `Counter` should return a `div` element which contains three buttons with text content in this order `Increment!`, `Decrement!`, `Reset`.
 | |
| 
 | |
| ```js
 | |
| assert(
 | |
|   (() => {
 | |
|     const mockedComponent = Enzyme.mount(React.createElement(Counter));
 | |
|     return (
 | |
|       mockedComponent.find('.inc').text() === 'Increment!' &&
 | |
|       mockedComponent.find('.dec').text() === 'Decrement!' &&
 | |
|       mockedComponent.find('.reset').text() === 'Reset'
 | |
|     );
 | |
|   })()
 | |
| );
 | |
| ```
 | |
| 
 | |
| The state of `Counter` should initialize with a `count` property set to `0`.
 | |
| 
 | |
| ```js
 | |
| const mockedComponent = Enzyme.mount(React.createElement(Counter));
 | |
| assert(mockedComponent.find('h1').text() === 'Current Count: 0');
 | |
| ```
 | |
| 
 | |
| Clicking the increment button should increment the count by `1`.
 | |
| 
 | |
| ```js
 | |
| const mockedComponent = Enzyme.mount(React.createElement(Counter));
 | |
| mockedComponent.find('.inc').simulate('click');
 | |
| assert(mockedComponent.find('h1').text() === 'Current Count: 1');
 | |
| ```
 | |
| 
 | |
| Clicking the decrement button should decrement the count by `1`.
 | |
| 
 | |
| ```js
 | |
| const mockedComponent = Enzyme.mount(React.createElement(Counter));
 | |
| mockedComponent.find('.dec').simulate('click');
 | |
| assert(mockedComponent.find('h1').text() === 'Current Count: -1');
 | |
| ```
 | |
| 
 | |
| Clicking the reset button should reset the count to `0`.
 | |
| 
 | |
| ```js
 | |
| const mockedComponent = Enzyme.mount(React.createElement(Counter));
 | |
| mockedComponent.setState({ count: 5 });
 | |
| const currentCountElement = mockedComponent.find('h1');
 | |
| assert(currentCountElement.text() === 'Current Count: 5');
 | |
| mockedComponent.find('.reset').simulate('click');
 | |
| assert(currentCountElement.text() === 'Current Count: 0');
 | |
| ```
 | |
| 
 | |
| # --seed--
 | |
| 
 | |
| ## --after-user-code--
 | |
| 
 | |
| ```jsx
 | |
| ReactDOM.render(<Counter />, document.getElementById('root'))
 | |
| ```
 | |
| 
 | |
| ## --seed-contents--
 | |
| 
 | |
| ```jsx
 | |
| class Counter extends React.Component {
 | |
|   constructor(props) {
 | |
|     super(props);
 | |
|     this.state = {
 | |
|       count: 0
 | |
|     };
 | |
|     // Change code below this line
 | |
| 
 | |
|     // Change code above this line
 | |
|   }
 | |
|   // Change code below this line
 | |
| 
 | |
|   // Change code above this line
 | |
|   render() {
 | |
|     return (
 | |
|       <div>
 | |
|         <button className='inc' onClick={this.increment}>Increment!</button>
 | |
|         <button className='dec' onClick={this.decrement}>Decrement!</button>
 | |
|         <button className='reset' onClick={this.reset}>Reset</button>
 | |
|         <h1>Current Count: {this.state.count}</h1>
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| };
 | |
| ```
 | |
| 
 | |
| # --solutions--
 | |
| 
 | |
| ```jsx
 | |
| class Counter extends React.Component {
 | |
|   constructor(props) {
 | |
|     super(props);
 | |
|     this.state = {
 | |
|       count: 0
 | |
|     };
 | |
|   this.increment = this.increment.bind(this);
 | |
|  this.decrement = this.decrement.bind(this);
 | |
|  this.reset = this.reset.bind(this);
 | |
|  }
 | |
|   reset() {
 | |
|     this.setState({
 | |
|       count: 0
 | |
|     });
 | |
|   }
 | |
|   increment() {
 | |
|     this.setState(state => ({
 | |
|       count: state.count + 1
 | |
|     }));
 | |
|   }
 | |
|   decrement() {
 | |
|     this.setState(state => ({
 | |
|       count: state.count - 1
 | |
|     }));
 | |
|   }
 | |
|   render() {
 | |
|     return (
 | |
|       <div>
 | |
|         <button className='inc' onClick={this.increment}>Increment!</button>
 | |
|         <button className='dec' onClick={this.decrement}>Decrement!</button>
 | |
|         <button className='reset' onClick={this.reset}>Reset</button>
 | |
|         <h1>Current Count: {this.state.count}</h1>
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| };
 | |
| ```
 |