URL: https://www.progressiverobot.com/vuejs-conditional-directives/

The ability to show or hide elements based on conditions is a fundamental feature of any frontend framework. Vue.js provides us with a set of core directives to achieve this effect: <^>v-if<^>, <^>v-else<^>, <^>v-else-if<^> and <^>v-show<^>.

After getting started with a Vue.js Hello World application, we can use values from JavaScript data object to conditionally control the view. For example, we'll see how to use the simple data object given below.

				
					
data() {

  return {

    msg: "Hello World!",

    isLoggedIn: false

  }

}

				
			

v-if

directives illustration for: v-if

The <^>v-if<^> directive adds or removes DOM elements based on the given expression.

We can use the isLoggedIn property from the data model and show a login button in the view.

				
					
&lt;button v-if="isLoggedIn"&gt;Logout&lt;/button&gt;

				
			

Now, the button will not show because isLoggedIn is set to <^>false<^>. Setting the data.isLoggedIn value to <^>true<^> would add the button to the DOM.

<template> element

The <^>v-if<^> directive can only show or hide one element (and its child elements), but you can also control multiple elements with a single <^>v-if<^> reducing duplication.

To do this, you need to wrap all the elements that should be controlled by this condition in a <^><template><^> element. The template element itself will not be added to the DOM. But all containing elements will be added or removed depending on the <^>v-if<^> expression.

For example, if you need to show a label as well as a button when the isLoggedIn is <^>true<^> you can wrap both elements in a single <^>template<^> element as follows.

				
					
&lt;template v-if="isLoggedIn"&gt;

  &lt;label&gt; Logout &lt;/button&gt;

  &lt;button&gt; Logout &lt;/button&gt;

&lt;/template&gt;

				
			

v-else

As the name <^>v-else<^> suggests, this directive is used to display content only when the expression adjacent <^>v-if<^> resolves to <^>false<^>.

We can have a <^>Log In<^> button to show automatically when the isLoggedIn is <^>false<^>.

				
					
&lt;button v-if="isLoggedIn"&gt; Logout &lt;/button&gt;

&lt;button v-else&gt; Log In &lt;/button&gt;

				
			

<^>v-else<^> does not need a value passed in to it. But it must be in an element that comes immediately after an element containing <^>v-if<^> or <^>v-else-if<^> directives.

v-else-if

<^>v-else-if<^> can be used when we need more than two options to be checked. This will ensure that only one of the chained items in the <^>else-if<^> chain will be visible.

For example, if the property named isLoginDisabled is true, we can prevent the <^>Log In<^> button from displaying and instead display a label. We can accomplish it by using the <^>v-else-if<^> directive as follows.

				
					
&lt;button v-if="isLoggedIn"&gt; Logout &lt;/button&gt;

&lt;label v-else-if="isLoginDisabled"&gt; Register disabled &lt;/label&gt;

&lt;button v-else&gt; Log In &lt;/button&gt;

				
			

v-show

Very similar to <^>v-if<^>, the <^>v-show<^> directive can also be used to show and hide an element based on an expression.

The main difference between the two is that,

  • <^>v-if<^> – Only renders the element to the DOM if the expression passes.
  • <^>v-show<^> – Renders all elements to the DOM and then uses the CSS display property to hide elements if the expression fails.
  • <^>v-show<^> – Does not support <^>v-else<^>, <^>v-else-if<^>

Usually, <^>v-show<^> has a performance advantage if the elements are switched on and off frequently, while the <^>v-if<^> has the advantage when it comes to initial render time.