v-if are two commonly used directives that manage the visibility of elements, but they function rather differently.
v-show both control whether an element will display based on the truthiness of the expression given. However, the method and timing of their rendering vary significantly.
v-if directive is a conditional directive in Vue.js that is used to conditionally render a block. When its condition is false, it prevents the rendering of an element completely. It is typically used when we need to display an element based on a certain condition. If the condition fails, then the DOM doesn't contain that element at all.
v-if supports usage along with
v-else-if directives for adding more conditions. For instance, here's how you might use those directives:
<div v-if="condition1">Condition 1 is true</div>
<div v-else-if="condition2">Condition 2 is true</div>
<div v-else>Neither condition is true</div>
On the other hand, the
v-show directive, which doesn't support else directives, also controls an element's visibility. It inserts all elements into the DOM irrespective of the condition and then uses CSS'
display property to hide or show the elements.
<div v-show="condition1">This div will be toggleable based on condition1</div>
v-show keeps the element in the DOM, only changing its display based on the condition.
v-if is a "real" conditional. It ensures that event listeners or child components inside the conditional block are properly destroyed and re-created during toggles. This means
v-if is lazy and switches only on the basis of conditions. If the condition is false on initial render, it won't even do anything.
On the contrary,
v-show is much simpler - the element will always be rendered and switched based only on CSS. This means
v-show is not lazy and renders the element regardless of the initial condition.
In conclusion, it is best to use
v-if if the condition is not likely to change at runtime as it has a high toggle cost.
v-show is advisable if conditions are likely to change frequently at runtime due to its low-cost visibility toggle.