- read

Vue Tip: Avoid Using v-if with v-for

John Philip 33

Vue Tip: Avoid Using v-if with v-for

Why You Don’t Need to Use v-if and v-for

John Philip
Level Up Coding
Published in
3 min readJust now


Vuejs Logo from Wikipedia

Vue.js offers directives and features that make it easy to create dynamic and interactive applications. Two commonly used directives in Vue.js are v-if and v-for. While these directives are incredibly useful on their own, using them together can lead to unexpected behavior and performance issues.

In this blog post, we will explore why you should avoid using v-if and v-for together and provide examples to illustrate the potential pitfalls.

Understanding v-if and v-for

Before we dive into the reasons for avoiding the combination of v-if and v-for, let’s briefly understand what each of these directives does:

  • v-if: The v-if directive is used to conditionally render an element. It evaluates an expression, and if the expression is truthy, the element is rendered; otherwise, it is removed from the DOM.
  • v-for: The v-for directive is used for rendering a list of items by iterating over an array or an object. It creates a new element for each item in the list.

The Pitfalls of Combining v-if and v-for

1. Unintended Rendering

When you use v-if and v-for on the same element, you might unintentionally create multiple elements, some of which might not be displayed due to the v-if condition. This can lead to unnecessary rendering and DOM manipulation.

<li v-for="item in items" v-if="item.isActive">{{ item.name }}</li>

When v-if and v-for are both used on the same element, v-if will be evaluated first. — Vue Documentation

In this example, Vue.js will create li elements for all items in the items array and then apply the v-if condition to each one individually. This can result in a larger DOM tree than expected, affecting performance.

2. Reduced Readability

Combining v-if and v-for can make your code less readable and harder to maintain. It becomes challenging to understand the logic of when and why an element is rendered, especially as your templates grow in complexity.