大家好,今天我们来解决一个让很多Vue新手纠结的问题:v-if和v-show到底有什么区别? 看起来都是控制元素显示隐藏,但用错了可是会拖慢你的应用速度哦!跟我一起揭开它们的神秘面纱吧!
抛出问题
先看这段代码:
<div v-show="isExpensive"> <!-- 这里该用v-if还是v-show? -->
<HeavyComponent /> <!-- 这是个非常耗性能的组件 -->
</div>
如果你的isExpensive大部分时间都是false,用v-show会让页面变慢!这就是很多人忽略的性能陷阱。接下来我们彻底搞懂这两个指令。
回答思路和要点
核心答案:
v-if是”要不要出生”,v-show是”要不要露脸”
-
v-if:条件为真才创建元素(涉及DOM操作) -
v-show:元素始终存在,只切换CSS显示(display: none)
记住这张对比表:
|
|
|
|
|---|---|---|
| 初始渲染 |
|
|
| 切换开销 |
|
|
| 适用场景 |
|
|
| 生命周期 |
|
|
深度原理解析
v-if 的工作流程(像开关工厂):
<div v-if="show">
我是需要时才出生的元素
</div>
相当于:
if (show) {
// 创建DOM元素
const div = document.createElement('div')
div.textContent = '我是需要时才出生的元素'
parent.appendChild(div)
} else {
// 完全销毁元素
if (existingDiv) parent.removeChild(existingDiv)
}
关键点:
-
切换时触发组件完整的生命周期( created/mounted/destroyed) -
元素被物理移除,不在DOM树中
v-show 的工作流程(像灯光师):
<div v-show="show">
我一直在后台待命
</div>
相当于:
const div = document.createElement('div')
div.textContent = '我一直在后台待命'
parent.appendChild(div)
// 只是切换样式
if (show) {
div.style.display = 'block' // 显示
} else {
div.style.display = 'none' // 隐藏
}
关键点:
-
元素始终存在DOM中 -
切换只是修改CSS的 display属性 -
不会触发组件生命周期
性能对比实验
测试代码:
<button @click="toggle">切换</button>
<!-- 测试v-if -->
<div v-if="show" class="heavy-block"></div>
<!-- 测试v-show -->
<div v-show="show" class="heavy-block"></div>
在Chrome DevTools的Performance面板观察:
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
结论:切换频率>1次/秒时,v-show的性能优势明显!
真实场景选择指南
✅ 用 v-if 的情况:
<!-- 场景1:初始不展示的重量级组件 -->
<ExpensiveChart v-if="user.isPremium" /> <!-- 减少初始加载时间 -->
<!-- 场景2:互斥显示的Tab页 -->
<template v-if="tab === 'profile'">
<UserProfile />
</template>
<template v-else-if="tab === 'settings'">
<UserSettings />
</template>
✅ 用 v-show 的情况:
<!-- 场景1:高频切换的UI元素 -->
<div v-show="isLoading">加载中...</div> <!-- 每秒可能触发多次 -->
<!-- 场景2:CSS动画需要保持DOM存在 -->
<transition>
<div v-show="showPopup"> <!-- 需要DOM存在才能执行动画 -->
我是弹窗内容
</div>
</transition>
新手避坑指南
坑1:在v-for里误用v-show
<!-- ❌ 错误:v-show不能用于控制循环 -->
<li v-for="item in list" v-show="item.visible">
{{ item.name }}
</li>
<!-- ✅ 正确:应该用v-if过滤数组 -->
<li v-for="item in visibleItems" :key="item.id">
{{ item.name }}
</li>
坑2:和transition搭配时的特殊处理
<!-- v-if配合transition -->
<transition>
<div v-if="show">我会触发过渡动画</div> <!-- 进入/离开动画 -->
</transition>
<!-- v-show配合transition -->
<transition name="fade">
<div v-show="show">我也能动画,但机制不同</div> <!-- 始终存在,只做透明度变化 -->
</transition>
终极决策流程图
遇到显示隐藏需求时,按这个思路选择:
需要控制元素是否存在? → 是 → 用 v-if
↓
否 → 需要高频切换(>1次/秒)? → 是 → 用 v-show
↓
否 → 元素很重? → 是 → 用 v-if
↓
否 → 都可以,推荐v-if(节省内存)
总结
最后送大家两句话:
“需要频繁切换的,用v-show省力;
需要优化首屏的,用v-if省资源”
理解了这个本质区别,你就能:
-
避免页面卡顿问题 -
提升应用响应速度 -
写出更专业的Vue代码
本篇文章来源于微信公众号: 程序员新世界
© 版权声明
本站网络名称:
冠昇产业
本站永久网址:
https://sr.lovedyt.cn
网站侵权说明:
本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系Email:2848989711@qq.com 删除处理。
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们第一时间更新。
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们第一时间更新。
THE END












- 最新
- 最热
只看作者