Introduction

In this post, I will show several ways to use conditionals while rendering html or component in jsx.

Consider we have a component, and based on a boolean flag we want to show or hide a paragraph <p>

Below is a small component which receives props having book name and author name. Lets not concentrate on how the whole app works. We want to focus on conditional rendering.

import React, { Component } from 'react'

export default class Book extends Component {
    constructor(props) {
        super(props);
        this.state = {
            show: false
        };
    }

    toggleInfo = () => {
        this.setState({show: !this.state.show});
    }

    render() {
        const {book, author} = this.props.info;
        return (
            <article>
                <h3>book: {book}</h3>
                <h5>author: {author}</h5>
            </article>
        )
    }
}

Objective

Lets include a button in this component, and on click lets toggle show or hide a paragraph.

Method-1 - Using inline boolean condition

import React, { Component } from 'react'

export default class Book extends Component {
    constructor(props) {
        super(props);
        this.state = {
            show: false
        };
    }

    toggleInfo = () => {
        this.setState({show: !this.state.show});
    }

    render() {
        const {book, author} = this.props.info;
        return (
            <article>
                <h3>book: {book}</h3>
                <h5>author: {author}</h5>
                <button type="button" onClick={this.toggleInfo}>Toggle Paragraph</button>

                {
                    this.state.show && <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsam, nobis!</p>
                }
            </article>
        )
    }
}

toggleInfo is self explanatory. We are just toggling a boolean flag in component’s state. In render() method, we are checking that boolean flag and showing the paragraph if this flag is true. Simple enough.

Method-2 - Using Ternary Operator

import React, { Component } from 'react'

export default class Book extends Component {
    constructor(props) {
        super(props);
        this.state = {
            show: false
        };
    }

    toggleInfo = () => {
        this.setState({show: !this.state.show});
    }

    render() {
        const {book, author} = this.props.info;
        return (
            <article>
                <h3>book: {book}</h3>
                <h5>author: {author}</h5>
                <button type="button" onClick={this.toggleInfo}>Toggle Paragraph</button>

                {
                    this.state.show ? 
                    (<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsam, nobis!</p>)
                    : null
                }
            </article>
        )
    }
}

Rest of the code is same. Note the ternary operator which is quite easy to understand.

Method-3 - By using a function

We can define a method(function) in the component which will take this decision whether to show the paragraph or not.

import React, { Component } from 'react'

export default class Book extends Component {
    constructor(props) {
        super(props);
        this.state = {
            show: false
        };
    }

    toggleInfo = () => {
        this.setState({show: !this.state.show});
    }

    toShow = () => {
        if (this.state.show) {
            return <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsam, nobis!</p>;
        }
        else {
            return null;
        }
    }

    render() {
        const {book, author} = this.props.info;
        return (
            <article>
                <h3>book: {book}</h3>
                <h5>author: {author}</h5>
                <button type="button" onClick={this.toggleInfo}>Toggle Paragraph</button>

                {this.toShow()}
            </article>
        )
    }
}

These three methods are simple to use, and you can use anyone.

Note: If you are having confusion that I did not use bind on the extra function I defined. Notice that I’m using ES6 arrow function, not the traditional function keyword.