Explain v-if as a structural mount/unmount decision, focusing on local-state resets, lifecycle cleanup, and the production pitfall of treating it like cheap visibility toggling.
Use this Vue interview question to rehearse a quick answer, common mistake, follow-up, and production pitfall.
How does v-if affect component creation and destruction?Frontend interview answer
This Vue interview question tests whether you can explain Vue v-if in production: mount/unmount resets, lifecycle cleanup, and toggle pitfalls, connect it to production trade-offs, and handle common follow-up questions.
- Vue v-if in production: mount/unmount resets, lifecycle cleanup, and toggle pitfalls explanation without falling back to memorized docs wording
- Directives and V If reasoning, edge cases, and production failure modes
- How you would answer the most likely Vue interview follow-up
Production pitfallv-if is not just a visibility toggle. For components, it is a mount or unmount decision. That means local state, timers, watchers, focus, and in-flight UI context can disappear each time the condition turns false. The common mistake is treating v-if like cheap show or hide behavior when it actually resets the branch.
When condition... | What Vue does | What you observe |
|---|---|---|
becomes true (first time) | Creates component instance and mounts it | setup()/data() runs, DOM is created, mounted hooks fire |
becomes false | Unmounts component instance and removes DOM | unmounted hooks fire, watchers/listeners cleaned up, DOM disappears |
becomes true again | Creates a new component instance (fresh) | Local state resets (unless state lives outside the component) |
<!-- Parent.vue -->
<script setup>
import { ref } from 'vue';
import Child from './Child.vue';
const show = ref(true);
</script>
<template>
<button @click="show = !show">Toggle</button>
<Child v-if="show" />
</template>
<!-- Child.vue -->
<script setup>
import { onMounted, onBeforeUnmount, ref } from 'vue';
const clicks = ref(0);
let id;
onMounted(() => {
console.log('mounted');
id = window.setInterval(() => console.log('tick'), 1000);
});
onBeforeUnmount(() => {
console.log('beforeUnmount (cleanup)');
window.clearInterval(id);
});
</script>
<template>
<button @click="clicks++">Clicks (resets after v-if): {{ clicks }}</button>
</template>
Area | What happens on v-if=false (unmount) | Why it matters |
|---|---|---|
Local component state | Discarded (next mount starts from initial state) | You lose UI state like input values, counters, local caches |
Watchers / effects | Stopped automatically | Avoids leaks, but also means side effects restart on next mount |
DOM + focus | Removed from DOM | Focus is lost; selection/caret state is gone |
Lifecycle hooks | Vue 3: beforeUnmount/unmounted (Vue 2: beforeDestroy/destroyed) | Interviewers often check that you know it’s actual destruction |
v-if vs v-show (performance + behavior)v-if has higher toggle cost (create/destroy) but zero cost when false (nothing exists). v-show has higher initial cost (always renders once) but cheap toggles (CSS display only).
Use case | Prefer | Reason |
|---|---|---|
Toggles frequently (tabs, dropdown open/close) | v-show | Avoid repeated mount/unmount work; keeps state + DOM |
Toggles rarely (auth gate, expensive panel, route-like branches) | v-if | Don’t pay initial render cost until needed; removes heavy DOM when off |
Must preserve state across toggles but still avoid rendering when hidden | Move state out / keep-alive (when applicable) | State lives outside the destroyed instance, or instance is cached |
<!-- v-show: component stays mounted, just hidden -->
<template>
<Child v-show="show" />
</template>
Forcing recreation even when staying on-screen
If you want to deliberately reset a component, you can change its key. A key change forces Vue to treat it as a different instance (destroy + create).
<template>
<Child :key="resetVersion" />
<button @click="resetVersion++">Hard reset Child</button>
</template>
<script setup>
import { ref } from 'vue';
import Child from './Child.vue';
const resetVersion = ref(0);
</script>
Interview-ready takeawayv-if is structural: it creates and destroys DOM and component instances. Toggling it re-runs setup/data and resets local state. Use v-show for frequent toggles, and keep state outside the component (or cache instances where appropriate) when you need persistence.
Use this as one explanation rep, then continue with the Vue.js interview questions cluster or a guided prep path.