Vue.js Conditional Rendering


Syntax

  • <element v-if="condition"></element> //v-if
  • <element v-if="condition"></element><element v-else="condition"></element> //v-if | v-else
  • <template v-if="condition">...</template> //templated v-if
  • <element v-show="condition"></element> //v-show

Remarks

It is very important to remember the difference between v-if and v-show. While their uses are almost identical, an element bound to v-if will only render into the DOM when it's condition is true for the first time. When using the v-show directive, all elements are rendered into the DOM but are hidden using the display style if the condition is false!

Overview

In Vue.js, conditional rendering is achieved by using a set of directives on elements in the template.

v-if

Element displays normally when condition is true. When the condition is false, only partial compilation occurs and the element isn't rendered into the DOM until the condition becomes true.

v-else

Does not accept a condition, but rather renders the element if the previous element's v-if condition is false. Can only be used after an element with the v-if directive.

v-show

Behaves similarly to v-if, however, the element will always be rendered into the DOM, even when the condition is false. If the condition is false, this directive will simply set the element's display style to none.

v-if / v-else

Assuming we have a Vue.js instance defined as:

var vm = new Vue({
    el: '#example',
    data: {
        a: true,
        b: false
    }
});

You can conditionally render any html element by including the v-if directive; the element that contains v-if will only render if the condition evaluates to true:

<!-- will render 'The condition is true' into the DOM -->
<div id="example">
    <h1 v-if="a">The condition is true</h1>
</div>

The <h1> element will render in this case, because the variable 'a' is true. v-if can be used with any expression, computed property, or function that evaluates to a boolean:

<div v-if="0 === 1">                  false; won't render</div>
<div v-if="typeof(5) === 'number'">   true; will render</div>

You can use a template element to group multiple elements together for a single condition:

<!-- in this case, nothing will be rendered except for the containing 'div' -->
<div id="example">
    <template v-if="b">
        <h1>Heading</h1>
        <p>Paragraph 1</p>
        <p>Paragraph 2</p>
    </template>
</div>

When using v-if, you also have the option of integrating a counter condition with the v-else directive. The content contained inside the element will only be displayed if the condition of the previous v-if was false. Note that this means that an element with v-else must appear immediately after an element with v-if.

<!-- will render only 'ELSE' -->
<div id="example">
    <h1 v-if="b">IF</h1>
    <h1 v-else="a">ELSE</h1>
</div>

Just as with v-if, with v-else you can group multiple html elements together within a <template>:

<div v-if="'a' === 'b'"> This will never be rendered. </div>
<template v-else>
    <ul>
      <li> You can also use templates with v-else. </li>
      <li> All of the content within the template </li>
      <li> will be rendered. </li>
    </ul>
</template>

v-show

The use of the v-show directive is almost identical to that of v-if. The only differences are that v-show does not support the <template> syntax, and there is no "alternative" condition.

var vm = new Vue({
    el: '#example',
    data: {
        a: true
    }
});

The basic use is as follows...

<!-- will render 'Condition met' -->
<div id="example">
    <h1 v-show="a">Condition met</h1>
</div>

While v-show does not support the v-else directive to define "alternative" conditions, this can be accomplished by negating the previous one...

<!-- will render 'This is shown' -->
<div id="example">
    <h1 v-show="!a">This is hidden</h1>
    <h1 v-show="a">This is shown</h1>
</div>