Conditional Rendering in Vue with v-if

Jul 4, 2019

The v-if directive allows you to conditionally render a block. It differs from v-show in that v-if doesn't actually create the element if its expression evaluates to false.

const app = new Vue({
  data: () => ({ render: false }),
  template: `
    <div>
      <h1 v-if="render">Hello, World</h1>
    </div>
  `
});

// Vue will **not** render 'Hello, World' because the `v-if`
// expression evaluates to false.
const data = await renderToString(app);
// <div data-server-rendered="true"><!----></div>
data;

v-else-if and v-else

Vue also has v-else-if and v-else directives that behave like else if and else in JavaScript.

const app = new Vue({
  data: () => ({ value: 1 }),
  template: `
    <div>
      <div v-if="value > 0">Positive</div>
      <div v-else-if="value < 0">Negative</div>
      <div v-else>Zero</div>
    </div>
  `
});

let data = await renderToString(app);
// <div data-server-rendered="true"><div>Positive</div></div>
data;

app._data.value = -1;
data = await renderToString(app);
// <div data-server-rendered="true"><div>Negative</div></div>
data;

app._data.value = 0;
data = await renderToString(app);
// <div data-server-rendered="true"><div>Zero</div></div>
data;

Lifecycle Hooks

Vue components have lifecycle hooks, like the created hook that gets called when the component gets created, and mounted when the component gets mounted.

When Vue renders a component because the v-if expression became truthy, it triggers both the 'created' and 'mounted' hooks. For example, the below code will print both 'Created!' and 'Mounted!' every time display changes to true from false.

Vue.component('test', {
  created: function() {
    console.log('Created!');
  },
  mounted: function() {
    console.log('Mounted!');
  },
  template: '<h1>Hello World</h1>'
});

const app = new Vue({
  data: () => ({ display: false }),
  template: `
    <div id="rendered-content">
      <test v-if="display"></test>
      <div>
        <button v-on:click="display = !display">Toggle</button>
      </div>
    </div>
  `
});

More Vue Tutorials