v-if 适合低频切换或首次不显示的场景,完全销毁DOM和组件实例;v-show 适合高频切换,仅控制display样式,保留组件实例。

Vue 中的 v-if 和 v-show 都能控制元素显隐,但机制完全不同。选错指令会导致不必要的 DOM 重建、内存占用升高或切换卡顿。关键不在“能不能用”,而在“什么时候该用哪个”。
看渲染频率:高频切换优先 v-show
当元素需要频繁显示/隐藏(比如下拉菜单、Tab 标签页、折叠面板),v-show 更合适。它只改 display: none/block,不销毁组件实例,没有编译开销。
- 适合场景:导航栏展开收起、表单步骤切换、弹窗内多个子模块切换
- 注意点:组件始终挂载,
mounted只执行一次;数据变化需手动响应,不能依赖created - 小技巧:配合
<keep-alive>使用,既能保留状态,又能避免重复渲染
看初始状态和使用频次:低频或首次不显示用 v-if
v-if 是真正的条件渲染——条件为 false 时,DOM 节点和组件实例完全不创建。初始加载快、内存占用低,适合一次性判断或很少切换的场景。
- 适合场景:登录态控制的用户中心入口、权限按钮、错误提示框、活动页开关
- 注意点:每次显示都会触发
created → mounted,隐藏会触发beforeUnmount → unmounted - 避坑:不要在
v-for内部直接写v-if,容易引发 key 冲突和渲染异常;应先过滤数据再遍历
看组件复杂度:重型组件默认倾向 v-if
一个带富文本编辑器、图表或大量子组件的模块,如果只是偶尔展示(如后台管理中的日志详情页),用 v-if 可避免长期占用内存和监听器泄漏风险。
立即学习“前端免费学习笔记(深入)”;
- 对比示例:v-show 下的 ECharts 实例持续监听 resize 事件;v-if 下它彻底卸载,无残留
- 补充策略:对中等复杂度组件,可结合
key控制局部重置,例如<Editor :key="editorKey" />,需要刷新时修改 key 值 - 警惕点:v-if 包裹的第三方组件若内部有未清理的定时器或全局事件监听,可能引发内存泄漏
组合使用更灵活:外层 v-if + 内层 v-show
实际项目中常混合使用。比如整个功能模块是否启用由权限决定(v-if),模块内部多个子区域切换则用 v-show。
- 典型结构:
<div v-if="hasReportPermission"><ReportTab v-show="activeTab === 'chart'" /><ReportTab v-show="activeTab === 'table'" /></div> - 优势:外层控制资源加载,内层保障交互流畅;既节省首屏体积,又提升操作响应速度
- 提醒:避免嵌套过深,三层以上条件组合建议抽离为计算属性或封装为独立组件



















