Vue-v-if和v-show的区别

107 阅读3分钟

在Vue.js中,v-ifv-show都用于控制元素的显示与隐藏,但它们的实现方式和适用场景有明显区别。以下是二者的核心差异总结:


1. 实现原理不同

  • v-if
    通过 条件性地创建/销毁DOM元素 来控制显示。
    当条件为 false 时,元素会从DOM树中完全移除(包括子组件和事件监听器)。

  • v-show
    通过 CSS的display: none属性 控制显示。
    无论条件如何,元素始终存在于DOM中,只是视觉上隐藏。


2. 初始渲染开销

  • v-if
    初始为false时不会渲染元素,节省初始加载资源,但切换时性能消耗较高(需要频繁创建/销毁DOM)。

  • v-show
    无论初始条件如何都会渲染元素,初始加载成本更高,但切换时性能消耗低(仅切换CSS属性)。


3. 适用场景

  • v-if 适合 不频繁切换 的场景(如页面初始化时决定是否渲染的静态内容)。
  • v-show 适合 频繁切换显示状态 的场景(如Tab切换、弹窗控制)。

4. 生命周期影响

  • v-if
    触发组件的生命周期钩子(如created/mounted在显示时调用,destroyed在隐藏时调用)。

  • v-show
    不会触发任何生命周期钩子,组件始终存在。


5. 其他特性

  • v-if 支持 v-elsev-else-if 实现逻辑分支。
  • v-show 不支持逻辑分支。

代码示例

<!-- v-if:条件为false时,DOM中不存在此元素 -->
<div v-if="isVisible">v-if控制的元素</div>

<!-- v-show:条件为false时,元素添加style="display: none;" -->
<div v-show="isVisible">v-show控制的元素</div>

总结

特性v-ifv-show
DOM操作条件性创建/销毁始终存在,仅切换CSS
初始渲染开销低(条件为false时)高(总是渲染)
切换性能消耗高(频繁切换时不推荐)低(适合高频切换)
生命周期触发
适用场景不频繁切换/复杂条件逻辑高频切换(如动画)

选择依据:

  • 需要减少初始负载条件很少变化v-if
  • 需要快速响应频繁切换v-show

回答:

首先是v-if和v-show都是控制元素的隐藏与显示的

实现原理不一样

v-if通过条件性的创建和销毁dom元素来控制显示。当条件为false时,元素会从dom树中完全移除,包括子组件和时间监听器。

v-show是通过css的display:none属性来控制的,无论条件如何,元素始终存在于dom中,只是视觉上的隐藏。

然后是初始化渲染不太一样

v-if初始为false时不会渲染元素,节省初始加载资源,但切换时性能消耗很高(需要频繁的创建/销毁DOM)

v-show无论初始条件如何都会渲染元素,初始加载资源的成本很高,但切换时性能消耗低(仅切换css属性)

所以说适用场景方面来说,v-if适合不频繁切换的场景,v-show适合频繁切换的场景。

而且v-if支持v-else v-else-if分支,v-show不支持逻辑分支。

最后从生命周期的角度来说,v-if切换会触发生命周期钩子,如组件会创建并挂载到DOM中触发created和mounted生命周期钩子,组件的销毁并从dom中移除又会触发destroyed钩子。而v-show在切换时不会触发,组件始终存在