* Fix solution * Update description * Add test for this.setState function syntax * Update toggle element instructions * Fix simple-counter solutions * Fix bind-this challenge seed and solution * Fix && challenge seed and solution * Fix ternary challenge seed and solution * Use the function form -> Pass a function Co-Authored-By: Oliver Eyton-Williams <ojeytonwilliams@gmail.com> * Mention "passing a function" instead of "alternative form" Co-Authored-By: Oliver Eyton-Williams <ojeytonwilliams@gmail.com> * Rephrase explanation Co-Authored-By: Oliver Eyton-Williams <ojeytonwilliams@gmail.com> * clarify why functions should be used Co-Authored-By: Randell Dawson <5313213+RandellDawson@users.noreply.github.com> * Improve tests * Fix \s escaping in [] * Improve regex Co-Authored-By: Randell Dawson <5313213+RandellDawson@users.noreply.github.com> * Add test for `this` * Use block code * Update bind-this challenge * Fix last part of instructions Co-Authored-By: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
4.6 KiB
4.6 KiB
id, title, challengeType, isRequired, forumTopicId
| id | title | challengeType | isRequired | forumTopicId |
|---|---|---|---|---|
| 5a24c314108439a4d4036185 | Use && for a More Concise Conditional | 6 | false | 301413 |
Description
else if statements to return slightly different UIs, you may repeat code which leaves room for error. Instead, you can use the && logical operator to perform conditional logic in a more concise way. This is possible because you want to check if a condition is true, and if it is, return some markup. Here's an example:
{condition && <p>markup</p>}
If the condition is true, the markup will be returned. If the condition is false, the operation will immediately return false after evaluating the condition and return nothing. You can include these statements directly in your JSX and string multiple conditions together by writing && after each one. This allows you to handle more complex conditional logic in your render() method without repeating a lot of code.
Instructions
h1 only renders if display is true, but use the && logical operator instead of an if/else statement.
Tests
tests:
- text: <code>MyComponent</code> should exist and render.
testString: assert((function() { const mockedComponent = Enzyme.mount(React.createElement(MyComponent)); return mockedComponent.find('MyComponent').length; })());
- text: When <code>display</code> is set to <code>true</code>, a <code>div</code>, <code>button</code>, and <code>h1</code> should render.
testString: '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(updated.find(''div'').length === 1 && updated.find(''div'').children().length === 2 && updated.find(''button'').length === 1 && updated.find(''h1'').length === 1); }; '
- text: When <code>display</code> is set to <code>false</code>, only a <code>div</code> and <code>button</code> should render.
testString: '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(updated.find(''div'').length === 1 && updated.find(''div'').children().length === 1 && updated.find(''button'').length === 1 && updated.find(''h1'').length === 0); }; '
- text: The render method should use the && logical operator to check the condition of this.state.display.
testString: getUserInput => assert(getUserInput('index').includes('&&'));
Challenge Seed
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>
);
}
};
After Test
ReactDOM.render(<MyComponent />, document.getElementById('root'))
Solution
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>
{this.state.display && <h1>Displayed!</h1>}
</div>
);
}
};