# Conditional React: 3 Ways To Control Your Component Flow

%%[kempo] 

If you've written any code, you've probably come across control flow.

But what is it?

Here's what [MDN says about control flow](https://developer.mozilla.org/en-US/docs/Glossary/Control_flow):

> The *control flow* is the order in which the computer executes statements in a script.

So control flow describes what parts of your code run and in what order. Cool...but that's not that interesting. It would be more valuable if we could *manipulate* the control flow and change your code's execution order.

Luckily most programming languages have built-in ways to do this.

While React isn't a programming language in its own right, it relies heavily on the fundamentals of JavaScript. Understanding how JavaScript deals with control flow will help you write flexible React components that change how they render.

There are 3 core ways to control how your components render.

## 1\. The if/else statement

The most common conditional is the basic [if/else statement](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else):

```typescript
function myFunc(name) {
    if (name === 'thesshguy') {
        return 'Cool';
    }
    return 'Not Cool';
}
```

An if/else statement lets you return *early* when some condition is met. This same principle can be used in your React components. You can return different JSX elements based on the value of a prop:

<iframe src="https://www.kempo.io/view/eyJuYW1lIjoiUmVhY3QgQ29uZGl0aW9uYWxzIGlmL2Vsc2UgU3RhdGVtZW50IiwiY29yZSI6eyJmaWxlcyI6eyIvc3R5bGVzLmNzcyI6eyJjb2RlIjoiYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xuICBmb250LXNtb290aGluZzogYXV0bztcbiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcbiAgZm9udC1zbW9vdGg6IGFsd2F5cztcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xufVxuXG5tYWluIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAzMnB4O1xuICAtLXNoYWRvdy1jb2xvcjogMjAzZGVnIDEwMCUgNyU7XG59XG5cbm1haW4gZGl2IHtcbiAgYm9yZGVyOiAycHggc29saWQgIzBjNGE2ZTtcbiAgcGFkZGluZzogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMGM0YTZlO1xuICBjb2xvcjogI2YwZjlmZjtcbiAgd2lkdGg6IDUwJTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3gtc2hhZG93OiAwLjRweCAwLjNweCAwLjdweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuMjIpLFxuICAgIDEuOXB4IDEuN3B4IDMuNHB4IC0wLjNweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuMzgpLFxuICAgIDQuMXB4IDMuOHB4IDcuNXB4IC0wLjdweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuNTUpLFxuICAgIDkuMnB4IDguM3B4IDE2LjdweCAtMXB4IGhzbCh2YXIoLS1zaGFkb3ctY29sb3IpIC8gMC43MSk7XG59In0sIi9BcHAuanMiOnsiY29kZSI6ImZ1bmN0aW9uIENvb2xDaGVja2VyKHByb3BzKSB7XG4gIGlmIChwcm9wcy5uYW1lID09PSAndGhlc3NoZ3V5Jykge1xuICAgIHJldHVybiA8ZGl2Pntwcm9wcy5uYW1lfSBpcyBjb29sITwvZGl2PjtcbiAgfVxuXG4gIHJldHVybiA8ZGl2Pntwcm9wcy5uYW1lfSBpcyBub3QgY29vbCDwn6W4ITwvZGl2Pjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkge1xuICByZXR1cm4gKFxuICAgIDxtYWluPlxuICAgICAgPENvb2xDaGVja2VyIG5hbWU9XCJ0aGVzc2hndXlcIiAvPlxuICAgICAgPENvb2xDaGVja2VyIG5hbWU9XCJvdGhlcmd1eVwiIC8+XG4gICAgPC9tYWluPlxuICApO1xufVxuIn0sIi9pbmRleC5qcyI6eyJjb2RlIjoiaW1wb3J0IFJlYWN0LCB7IFN0cmljdE1vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZVJvb3QgfSBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiO1xuaW1wb3J0IFwiLi9zdHlsZXMuY3NzXCI7XG5cbmltcG9ydCBBcHAgZnJvbSBcIi4vQXBwXCI7XG5cbmNvbnN0IHJvb3QgPSBjcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vdFwiKSk7XG5yb290LnJlbmRlcihcbiAgPFN0cmljdE1vZGU+XG4gICAgPEFwcCAvPlxuICA8L1N0cmljdE1vZGU+XG4pOyJ9LCIvcHVibGljL2luZGV4Lmh0bWwiOnsiY29kZSI6IjwhRE9DVFlQRSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCI+XG4gICAgPHRpdGxlPkRvY3VtZW50PC90aXRsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8ZGl2IGlkPVwicm9vdFwiPjwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+In0sIi9wYWNrYWdlLmpzb24iOnsiY29kZSI6IntcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwicmVhY3RcIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1kb21cIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1zY3JpcHRzXCI6IFwiXjQuMC4wXCJcbiAgfSxcbiAgXCJtYWluXCI6IFwiL2luZGV4LmpzXCIsXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHt9XG59In19LCJ0ZW1wbGF0ZSI6InJlYWN0In0sImRpc3BsYXkiOnsiY29tcG9uZW50cyI6eyJFZGl0b3IiOnsidHlwZSI6ImVkaXRvciIsImRhdGEiOnsic2hvd1RhYnMiOmZhbHNlLCJzaG93TGluZU51bWJlcnMiOnRydWUsInNob3dJbmxpbmVFcnJvcnMiOmZhbHNlLCJzaG93UnVuQnV0dG9uIjpmYWxzZSwid3JhcENvbnRlbnQiOmZhbHNlLCJjbG9zYWJsZVRhYnMiOmZhbHNlLCJyZWFkT25seSI6ZmFsc2UsInNob3dSZWFkT25seSI6ZmFsc2V9fSwiUHJldmlldyI6eyJ0eXBlIjoicHJldmlldyIsImRhdGEiOnsic2hvd05hdmlnYXRvciI6ZmFsc2UsInNob3dPcGVuSW5Db2RlU2FuZGJveCI6ZmFsc2UsInNob3dSZWZyZXNoQnV0dG9uIjp0cnVlLCJzaG93U2FuZHBhY2tFcnJvck92ZXJsYXkiOnRydWUsInJlbGF0aXZlUGF0aCI6IiJ9fX0sImdlbmVyYWwiOnsiYWN0aXZlRmlsZSI6Ii9BcHAuanMiLCJ2aXNpYmxlRmlsZXMiOlsiL0FwcC5qcyJdLCJ0aGVtZSI6ImRyYWN1bGEiLCJlbmFibGVGdWxsU2NyZWVuIjpmYWxzZSwiZW5hYmxlRm9ybWF0dGluZyI6dHJ1ZX0sImxheW91dHMiOnsic21hbGwiOiInRWRpdG9yJ1xuJ0VkaXRvcidcbidQcmV2aWV3JyJ9fX0=" height="600" width="100%"></iframe>

Notice how we return different JSX based on the `name` prop.

Try changing the names to see what happens.

## 2\. The ternary operator

If you've never seen a ternary operator before, it might look a little confusing at first.

The ternary operator takes three inputs and returns a single value. The three inputs are a **condition**, a **truthy value**, and a **falsy value**. **Truthy** and **falsy** just mean values that are considered `true` or `false` when converted to a `Boolean`.

All ternary operators follow the same format in JavaScript:

1. A condition followed by a `?`
    
2. An expression to execute if the condition is **truthy** followed by a `:`
    
3. An expression to execute if the condition is **falsy**
    

**Note:** If that's still not clear, you can use the handy acronym ***W.T.F.*** to help you remember: `what (cond) ? true : false`.

```typescript
function myFunc(name) {
    /*
     * W.T.F.
     * 1. What: name === 'thesshguy'
     * 2. True: 'Cool'
     * 3. False: 'Not Cool'
     */
    return name === 'thesshguy' ? 'Cool' : 'Not Cool';
}
```

If that sounds familiar, it should.

The ternary operator is often used as an alternative to the if/else statement.

Let's rewrite the example above using a ternary operator:

<iframe src="https://www.kempo.io/view/eyJuYW1lIjoiUmVhY3QgQ29uZGl0aW9uYWxzIiwiY29yZSI6eyJmaWxlcyI6eyIvc3R5bGVzLmNzcyI6eyJjb2RlIjoiYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xuICBmb250LXNtb290aGluZzogYXV0bztcbiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcbiAgZm9udC1zbW9vdGg6IGFsd2F5cztcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xufVxuXG5tYWluIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAzMnB4O1xuICAtLXNoYWRvdy1jb2xvcjogMjAzZGVnIDEwMCUgNyU7XG59XG5cbm1haW4gZGl2IHtcbiAgYm9yZGVyOiAycHggc29saWQgIzBjNGE2ZTtcbiAgcGFkZGluZzogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMGM0YTZlO1xuICBjb2xvcjogI2YwZjlmZjtcbiAgd2lkdGg6IDUwJTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3gtc2hhZG93OiAwLjRweCAwLjNweCAwLjdweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuMjIpLFxuICAgIDEuOXB4IDEuN3B4IDMuNHB4IC0wLjNweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuMzgpLFxuICAgIDQuMXB4IDMuOHB4IDcuNXB4IC0wLjdweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuNTUpLFxuICAgIDkuMnB4IDguM3B4IDE2LjdweCAtMXB4IGhzbCh2YXIoLS1zaGFkb3ctY29sb3IpIC8gMC43MSk7XG59In0sIi9BcHAuanMiOnsiY29kZSI6ImZ1bmN0aW9uIENvb2xDaGVja2VyKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5uYW1lID09PSBcInRoZXNzaGd1eVwiXG4gICAgPyA8ZGl2Pntwcm9wcy5uYW1lfSBpcyBjb29sITwvZGl2PlxuICAgIDogPGRpdj57cHJvcHMubmFtZX0gaXMgbm90IGNvb2wg8J+luCE8L2Rpdj47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCgpIHtcbiAgcmV0dXJuIChcbiAgICA8bWFpbj5cbiAgICAgIDxDb29sQ2hlY2tlciBuYW1lPVwidGhlc3NoZ3V5XCIgLz5cbiAgICAgIDxDb29sQ2hlY2tlciBuYW1lPVwib3RoZXJndXlcIiAvPlxuICAgIDwvbWFpbj5cbiAgKTtcbn1cbiJ9LCIvaW5kZXguanMiOnsiY29kZSI6ImltcG9ydCBSZWFjdCwgeyBTdHJpY3RNb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIjtcbmltcG9ydCBcIi4vc3R5bGVzLmNzc1wiO1xuXG5pbXBvcnQgQXBwIGZyb20gXCIuL0FwcFwiO1xuXG5jb25zdCByb290ID0gY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb3RcIikpO1xucm9vdC5yZW5kZXIoXG4gIDxTdHJpY3RNb2RlPlxuICAgIDxBcHAgLz5cbiAgPC9TdHJpY3RNb2RlPlxuKTsifSwiL3B1YmxpYy9pbmRleC5odG1sIjp7ImNvZGUiOiI8IURPQ1RZUEUgaHRtbD5cbjxodG1sIGxhbmc9XCJlblwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMFwiPlxuICAgIDx0aXRsZT5Eb2N1bWVudDwvdGl0bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPGRpdiBpZD1cInJvb3RcIj48L2Rpdj5cbiAgPC9ib2R5PlxuPC9odG1sPiJ9LCIvcGFja2FnZS5qc29uIjp7ImNvZGUiOiJ7XG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInJlYWN0XCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3QtZG9tXCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3Qtc2NyaXB0c1wiOiBcIl40LjAuMFwiXG4gIH0sXG4gIFwibWFpblwiOiBcIi9pbmRleC5qc1wiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7fVxufSJ9fSwidGVtcGxhdGUiOiJyZWFjdCJ9LCJkaXNwbGF5Ijp7ImNvbXBvbmVudHMiOnsiRWRpdG9yIjp7InR5cGUiOiJlZGl0b3IiLCJkYXRhIjp7InNob3dUYWJzIjpmYWxzZSwic2hvd0xpbmVOdW1iZXJzIjp0cnVlLCJzaG93SW5saW5lRXJyb3JzIjpmYWxzZSwic2hvd1J1bkJ1dHRvbiI6ZmFsc2UsIndyYXBDb250ZW50IjpmYWxzZSwiY2xvc2FibGVUYWJzIjpmYWxzZSwicmVhZE9ubHkiOmZhbHNlLCJzaG93UmVhZE9ubHkiOmZhbHNlfX0sIlByZXZpZXciOnsidHlwZSI6InByZXZpZXciLCJkYXRhIjp7InNob3dOYXZpZ2F0b3IiOmZhbHNlLCJzaG93T3BlbkluQ29kZVNhbmRib3giOmZhbHNlLCJzaG93UmVmcmVzaEJ1dHRvbiI6dHJ1ZSwic2hvd1NhbmRwYWNrRXJyb3JPdmVybGF5Ijp0cnVlfX19LCJnZW5lcmFsIjp7ImFjdGl2ZUZpbGUiOiIvQXBwLmpzIiwidmlzaWJsZUZpbGVzIjpbIi9BcHAuanMiXSwidGhlbWUiOiJkcmFjdWxhIiwiZW5hYmxlRnVsbFNjcmVlbiI6ZmFsc2UsImVuYWJsZUZvcm1hdHRpbmciOnRydWV9LCJsYXlvdXRzIjp7InNtYWxsIjoiJ0VkaXRvcidcbidFZGl0b3InXG4nUHJldmlldycifX19" height="600" width="100%"></iframe>

Easy!

But why would you ever choose to use the ternary operator? Is the only difference the syntax, or are there *other* benefits?

Great questions!

### Ternary operators can be used in JSX

One drawback of the if/else statement is that it can't be used inside of JSX:

```typescript
function MyComponent() {
    return (
        <div>
            {
                if (someCondition) {
                    return 'True';
                }
            }
        </div>
    );
}
```

The reason you can't do this has to do with how JSX is converted to HTML under the hood. If you want an in-depth explanation, you can read my post about [how React converts JSX to HTML](https://blog.thesshguy.com/react-jsx-to-html). If you want to skip that post (I totally understand if you do 🙂), here's a quick recap.

When your React code is built, the above gets converted to the following:

```typescript
function MyComponent() {
    return React.createElement(
        'div',
        {},
        if (someCondition) {
            return 'True';
        }
    );
}
```

A JSX element's children are passed as arguments to `React.createElement`.

The issue is that an if/else statement can't be used as a value in JavaScript. It can't be passed as a function argument. Since it doesn't have a value, JavaScript can't do anything with it.

It's not a limitation with React, but rather a limitation with JavaScript.

On the other hand, a ternary operator *can* be used in JSX for the same reason. It resolves to a value that *can* be passed to `React.createElement`. This means the following will work:

<iframe src="https://www.kempo.io/view/eyJuYW1lIjoiUmVhY3QgQ29uZGl0aW9uYWxzIiwiY29yZSI6eyJmaWxlcyI6eyIvc3R5bGVzLmNzcyI6eyJjb2RlIjoiYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xuICBmb250LXNtb290aGluZzogYXV0bztcbiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcbiAgZm9udC1zbW9vdGg6IGFsd2F5cztcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xufVxuXG5tYWluIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAzMnB4O1xuICAtLXNoYWRvdy1jb2xvcjogMjAzZGVnIDEwMCUgNyU7XG59XG5cbm1haW4gZGl2IHtcbiAgYm9yZGVyOiAycHggc29saWQgIzBjNGE2ZTtcbiAgcGFkZGluZzogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMGM0YTZlO1xuICBjb2xvcjogI2YwZjlmZjtcbiAgd2lkdGg6IDUwJTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3gtc2hhZG93OiAwLjRweCAwLjNweCAwLjdweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuMjIpLFxuICAgIDEuOXB4IDEuN3B4IDMuNHB4IC0wLjNweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuMzgpLFxuICAgIDQuMXB4IDMuOHB4IDcuNXB4IC0wLjdweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuNTUpLFxuICAgIDkuMnB4IDguM3B4IDE2LjdweCAtMXB4IGhzbCh2YXIoLS1zaGFkb3ctY29sb3IpIC8gMC43MSk7XG59In0sIi9BcHAuanMiOnsiY29kZSI6ImZ1bmN0aW9uIENvb2xDaGVja2VyKHByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGRpdj5cbiAgICAgIHtwcm9wcy5uYW1lfVxuICAgICAge3Byb3BzLm5hbWUgPT09IFwidGhlc3NoZ3V5XCIgPyBcIiBpcyBjb29sIVwiIDogXCIgaXMgbm90IGNvb2wg8J+luCFcIn1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkge1xuICByZXR1cm4gKFxuICAgIDxtYWluPlxuICAgICAgPENvb2xDaGVja2VyIG5hbWU9XCJ0aGVzc2hndXlcIiAvPlxuICAgICAgPENvb2xDaGVja2VyIG5hbWU9XCJvdGhlcmd1eVwiIC8+XG4gICAgPC9tYWluPlxuICApO1xufVxuIn0sIi9pbmRleC5qcyI6eyJjb2RlIjoiaW1wb3J0IFJlYWN0LCB7IFN0cmljdE1vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZVJvb3QgfSBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiO1xuaW1wb3J0IFwiLi9zdHlsZXMuY3NzXCI7XG5cbmltcG9ydCBBcHAgZnJvbSBcIi4vQXBwXCI7XG5cbmNvbnN0IHJvb3QgPSBjcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vdFwiKSk7XG5yb290LnJlbmRlcihcbiAgPFN0cmljdE1vZGU+XG4gICAgPEFwcCAvPlxuICA8L1N0cmljdE1vZGU+XG4pOyJ9LCIvcHVibGljL2luZGV4Lmh0bWwiOnsiY29kZSI6IjwhRE9DVFlQRSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCI+XG4gICAgPHRpdGxlPkRvY3VtZW50PC90aXRsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8ZGl2IGlkPVwicm9vdFwiPjwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+In0sIi9wYWNrYWdlLmpzb24iOnsiY29kZSI6IntcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwicmVhY3RcIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1kb21cIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1zY3JpcHRzXCI6IFwiXjQuMC4wXCJcbiAgfSxcbiAgXCJtYWluXCI6IFwiL2luZGV4LmpzXCIsXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHt9XG59In19LCJ0ZW1wbGF0ZSI6InJlYWN0In0sImRpc3BsYXkiOnsiY29tcG9uZW50cyI6eyJFZGl0b3IiOnsidHlwZSI6ImVkaXRvciIsImRhdGEiOnsic2hvd1RhYnMiOmZhbHNlLCJzaG93TGluZU51bWJlcnMiOnRydWUsInNob3dJbmxpbmVFcnJvcnMiOmZhbHNlLCJzaG93UnVuQnV0dG9uIjpmYWxzZSwid3JhcENvbnRlbnQiOmZhbHNlLCJjbG9zYWJsZVRhYnMiOmZhbHNlLCJyZWFkT25seSI6ZmFsc2UsInNob3dSZWFkT25seSI6ZmFsc2V9fSwiUHJldmlldyI6eyJ0eXBlIjoicHJldmlldyIsImRhdGEiOnsic2hvd05hdmlnYXRvciI6ZmFsc2UsInNob3dPcGVuSW5Db2RlU2FuZGJveCI6ZmFsc2UsInNob3dSZWZyZXNoQnV0dG9uIjp0cnVlLCJzaG93U2FuZHBhY2tFcnJvck92ZXJsYXkiOnRydWV9fX0sImdlbmVyYWwiOnsiYWN0aXZlRmlsZSI6Ii9BcHAuanMiLCJ2aXNpYmxlRmlsZXMiOlsiL0FwcC5qcyJdLCJ0aGVtZSI6ImRyYWN1bGEiLCJlbmFibGVGdWxsU2NyZWVuIjpmYWxzZSwiZW5hYmxlRm9ybWF0dGluZyI6dHJ1ZX0sImxheW91dHMiOnsic21hbGwiOiInRWRpdG9yJ1xuJ0VkaXRvcidcbidQcmV2aWV3JyJ9fX0=" height="600" width="100%"></iframe>

Another benefit is that this pattern lets us [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) up our code. We don't need to repeat the `<div></div>` for both conditions.

## 3\. The Logical AND (&&) operator

The final way to render things conditionally in React is with the [Logical AND (&&) operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND).

The Logical AND takes two inputs separated by the `&&` operator. If the first value is **truthy** then the second value is returned. If the first value is **falsy** then the first value is returned:

```typescript
function LogicalANDExample() {
    return true && 'Hello'; // returns 'Hello'
    return false && 'Hello'; // returns false
}
```

This same idea can be used to render JSX elements in a React component. If you make the second value a JSX element, you can conditionally render it based on the first value:

<iframe src="https://www.kempo.io/view/eyJuYW1lIjoiUmVhY3QgQ29uZGl0aW9uYWxzIiwiY29yZSI6eyJmaWxlcyI6eyIvc3R5bGVzLmNzcyI6eyJjb2RlIjoiYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xuICBmb250LXNtb290aGluZzogYXV0bztcbiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcbiAgZm9udC1zbW9vdGg6IGFsd2F5cztcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xufVxuXG5tYWluIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAzMnB4O1xuICAtLXNoYWRvdy1jb2xvcjogMjAzZGVnIDEwMCUgNyU7XG59XG5cbm1haW4gZGl2IHtcbiAgYm9yZGVyOiAycHggc29saWQgIzBjNGE2ZTtcbiAgcGFkZGluZzogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMGM0YTZlO1xuICBjb2xvcjogI2YwZjlmZjtcbiAgd2lkdGg6IDUwJTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3gtc2hhZG93OiAwLjRweCAwLjNweCAwLjdweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuMjIpLFxuICAgIDEuOXB4IDEuN3B4IDMuNHB4IC0wLjNweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuMzgpLFxuICAgIDQuMXB4IDMuOHB4IDcuNXB4IC0wLjdweCBoc2wodmFyKC0tc2hhZG93LWNvbG9yKSAvIDAuNTUpLFxuICAgIDkuMnB4IDguM3B4IDE2LjdweCAtMXB4IGhzbCh2YXIoLS1zaGFkb3ctY29sb3IpIC8gMC43MSk7XG59In0sIi9BcHAuanMiOnsiY29kZSI6ImZ1bmN0aW9uIENvb2xDaGVja2VyKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5uYW1lID09PSBcInRoZXNzaGd1eVwiICYmIDxkaXY+e3Byb3BzLm5hbWV9IGlzIGNvb2whPC9kaXY+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7XG4gIHJldHVybiAoXG4gICAgPG1haW4+XG4gICAgICA8Q29vbENoZWNrZXIgbmFtZT1cInRoZXNzaGd1eVwiIC8+XG4gICAgICA8Q29vbENoZWNrZXIgbmFtZT1cIm90aGVyZ3V5XCIgLz5cbiAgICA8L21haW4+XG4gICk7XG59XG4ifSwiL2luZGV4LmpzIjp7ImNvZGUiOiJpbXBvcnQgUmVhY3QsIHsgU3RyaWN0TW9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCI7XG5pbXBvcnQgXCIuL3N0eWxlcy5jc3NcIjtcblxuaW1wb3J0IEFwcCBmcm9tIFwiLi9BcHBcIjtcblxuY29uc3Qgcm9vdCA9IGNyZWF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyb290XCIpKTtcbnJvb3QucmVuZGVyKFxuICA8U3RyaWN0TW9kZT5cbiAgICA8QXBwIC8+XG4gIDwvU3RyaWN0TW9kZT5cbik7In0sIi9wdWJsaWMvaW5kZXguaHRtbCI6eyJjb2RlIjoiPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cIlVURi04XCI+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjBcIj5cbiAgICA8dGl0bGU+RG9jdW1lbnQ8L3RpdGxlPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxkaXYgaWQ9XCJyb290XCI+PC9kaXY+XG4gIDwvYm9keT5cbjwvaHRtbD4ifSwiL3BhY2thZ2UuanNvbiI6eyJjb2RlIjoie1xuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJyZWFjdFwiOiBcIl4xOC4wLjBcIixcbiAgICBcInJlYWN0LWRvbVwiOiBcIl4xOC4wLjBcIixcbiAgICBcInJlYWN0LXNjcmlwdHNcIjogXCJeNC4wLjBcIlxuICB9LFxuICBcIm1haW5cIjogXCIvaW5kZXguanNcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge31cbn0ifX0sInRlbXBsYXRlIjoicmVhY3QifSwiZGlzcGxheSI6eyJjb21wb25lbnRzIjp7IkVkaXRvciI6eyJ0eXBlIjoiZWRpdG9yIiwiZGF0YSI6eyJzaG93VGFicyI6ZmFsc2UsInNob3dMaW5lTnVtYmVycyI6dHJ1ZSwic2hvd0lubGluZUVycm9ycyI6ZmFsc2UsInNob3dSdW5CdXR0b24iOmZhbHNlLCJ3cmFwQ29udGVudCI6ZmFsc2UsImNsb3NhYmxlVGFicyI6ZmFsc2UsInJlYWRPbmx5IjpmYWxzZSwic2hvd1JlYWRPbmx5IjpmYWxzZX19LCJQcmV2aWV3Ijp7InR5cGUiOiJwcmV2aWV3IiwiZGF0YSI6eyJzaG93TmF2aWdhdG9yIjpmYWxzZSwic2hvd09wZW5JbkNvZGVTYW5kYm94IjpmYWxzZSwic2hvd1JlZnJlc2hCdXR0b24iOnRydWUsInNob3dTYW5kcGFja0Vycm9yT3ZlcmxheSI6dHJ1ZX19fSwiZ2VuZXJhbCI6eyJhY3RpdmVGaWxlIjoiL0FwcC5qcyIsInZpc2libGVGaWxlcyI6WyIvQXBwLmpzIl0sInRoZW1lIjoiZHJhY3VsYSIsImVuYWJsZUZ1bGxTY3JlZW4iOmZhbHNlLCJlbmFibGVGb3JtYXR0aW5nIjp0cnVlfSwibGF5b3V0cyI6eyJzbWFsbCI6IidFZGl0b3InXG4nRWRpdG9yJ1xuJ1ByZXZpZXcnIn19fQ==" height="500" width="100%"></iframe>

If `props.name` equals the string `thesshguy`, we return the JSX, otherwise, we return `false`.

It should be clear why the second `div` no longer shows up. The condition is `false` so we don't return the `div` in that case. But what about the value that we *are* returning?

What the heck happened to the `false` value and why didn't React render it?

### React doesn't render (*some*) falsy values

Let's say you have a situation where you don't want to render *anything*.

React allows for this by letting you return certain **falsy** values. The most common value that's used for this is `null`:

```typescript
function EmptyComponent() {
    return null;
}

function App() {
    // I do not render anything
    return <EmptyComponent />;
}
```

This is also the case for `undefined` and `false`, which is why in the example above, nothing is rendered for the second `<CoolChecker name="otherguy" />` element.

### What about 0?

One thing that trips up new React developers is the value `0`. While it *is***falsy**, when you use it as the first value of the Logical AND operator, React *still* renders it:

<iframe src="https://www.kempo.io/view/eyJuYW1lIjoiUmVhY3QgQ29uZGl0aW9uYWxzIiwiY29yZSI6eyJmaWxlcyI6eyIvc3R5bGVzLmNzcyI6eyJjb2RlIjoiYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LWZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xuICBmb250LXNtb290aGluZzogYXV0bztcbiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcbiAgZm9udC1zbW9vdGg6IGFsd2F5cztcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xufVxuXG4jcm9vdCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbm1haW4ge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbmRpdiB7XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG59In0sIi9BcHAuanMiOnsiY29kZSI6ImZ1bmN0aW9uIFJlbmRlckNvdW50KHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jb3VudCAmJiA8ZGl2PkNvdW50IGlzIHtwcm9wcy5jb3VudH08L2Rpdj47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCgpIHtcbiAgcmV0dXJuIChcbiAgICA8bWFpbj5cbiAgICAgIDxSZW5kZXJDb3VudCBjb3VudD17MX0gLz5cbiAgICAgIDxSZW5kZXJDb3VudCBjb3VudD17MH0gLz5cbiAgICA8L21haW4+XG4gICk7XG59XG4ifSwiL2luZGV4LmpzIjp7ImNvZGUiOiJpbXBvcnQgUmVhY3QsIHsgU3RyaWN0TW9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCI7XG5pbXBvcnQgXCIuL3N0eWxlcy5jc3NcIjtcblxuaW1wb3J0IEFwcCBmcm9tIFwiLi9BcHBcIjtcblxuY29uc3Qgcm9vdCA9IGNyZWF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyb290XCIpKTtcbnJvb3QucmVuZGVyKFxuICA8U3RyaWN0TW9kZT5cbiAgICA8QXBwIC8+XG4gIDwvU3RyaWN0TW9kZT5cbik7In0sIi9wdWJsaWMvaW5kZXguaHRtbCI6eyJjb2RlIjoiPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cIlVURi04XCI+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjBcIj5cbiAgICA8dGl0bGU+RG9jdW1lbnQ8L3RpdGxlPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxkaXYgaWQ9XCJyb290XCI+PC9kaXY+XG4gIDwvYm9keT5cbjwvaHRtbD4ifSwiL3BhY2thZ2UuanNvbiI6eyJjb2RlIjoie1xuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJyZWFjdFwiOiBcIl4xOC4wLjBcIixcbiAgICBcInJlYWN0LWRvbVwiOiBcIl4xOC4wLjBcIixcbiAgICBcInJlYWN0LXNjcmlwdHNcIjogXCJeNC4wLjBcIlxuICB9LFxuICBcIm1haW5cIjogXCIvaW5kZXguanNcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge31cbn0ifX0sInRlbXBsYXRlIjoicmVhY3QifSwiZGlzcGxheSI6eyJjb21wb25lbnRzIjp7IkVkaXRvciI6eyJ0eXBlIjoiZWRpdG9yIiwiZGF0YSI6eyJzaG93VGFicyI6ZmFsc2UsInNob3dMaW5lTnVtYmVycyI6dHJ1ZSwic2hvd0lubGluZUVycm9ycyI6ZmFsc2UsInNob3dSdW5CdXR0b24iOmZhbHNlLCJ3cmFwQ29udGVudCI6ZmFsc2UsImNsb3NhYmxlVGFicyI6ZmFsc2UsInJlYWRPbmx5IjpmYWxzZSwic2hvd1JlYWRPbmx5IjpmYWxzZX19LCJQcmV2aWV3Ijp7InR5cGUiOiJwcmV2aWV3IiwiZGF0YSI6eyJzaG93TmF2aWdhdG9yIjpmYWxzZSwic2hvd09wZW5JbkNvZGVTYW5kYm94IjpmYWxzZSwic2hvd1JlZnJlc2hCdXR0b24iOnRydWUsInNob3dTYW5kcGFja0Vycm9yT3ZlcmxheSI6dHJ1ZX19fSwiZ2VuZXJhbCI6eyJhY3RpdmVGaWxlIjoiL0FwcC5qcyIsInZpc2libGVGaWxlcyI6WyIvQXBwLmpzIl0sInRoZW1lIjoiZHJhY3VsYSIsImVuYWJsZUZ1bGxTY3JlZW4iOmZhbHNlLCJlbmFibGVGb3JtYXR0aW5nIjp0cnVlfSwibGF5b3V0cyI6eyJzbWFsbCI6IidFZGl0b3InXG4nRWRpdG9yJ1xuJ1ByZXZpZXcnIn19fQ==" height="450" width="100%"></iframe>

This can be a bit confusing at first, but it makes sense why React would do this.

There are legitimate reasons why you'd want to render `0`. For example, maybe you want to show a countdown on the page. If React didn't render `0`, you'd have to convert it to a string first.

So how do you get around this issue?

The easiest way is to make sure you return `false` instead:

```typescript
function RenderCount(props) {
  return props.count > 0 && <div>Count is {props.count}</div>;
}
```

One way to do that is with a comparison operator like *greater than*. Not only does `props.count > 0` always return a boolean, it also makes the intention of the code more clear.

Win-Win!

## Conditionals for JSX assignment

JSX isn't limited to `return` statements.

You can assign JSX to a variable. This lets you reuse the JSX in multiple places and keeps the code clean. Variable assignment can take advantage of all the conditional logic that's been mentioned above:

```typescript
function MyComponent() {
    let first;
    if (someCond) {
        first = <div>The if/else statement is true!</div>;
    }

    const second = (
        <div>
            The ternary is {someCond ? 'true!' : 'false!'}
        </div>
    );

    const third = someCond && <div>The Logical AND is true!</div>;

    return (
        <div>
            {first}
            {second}
            {third}
        </div>
    );
}
```

What's great about all the examples above is that they rely on standard JavaScript functionality.

By learning how to manage control flow for your React components, you become a better JavaScript developer!
