当前位置: 首页 > news >正文

12、v-show 和 v-if 的区别

v-show 和 v-if 的区别

核心区别

1. 渲染方式

v-if(条件渲染):

  • 是"真正"的条件渲染
  • 条件为false时,元素不会被渲染到 DOM
  • 条件为true时,才会创建和渲染元素

v-show(显示切换):

  • 无论条件是什么,元素始终会被渲染到 DOM
  • 只是通过 CSS 的display属性来控制显示/隐藏
  • 条件为false时,添加display: none
<!-- v-if:条件为 false 时,DOM 中没有这个元素 --> <div v-if="isShow">Hello</div> <!-- v-show:条件为 false 时,DOM 中有这个元素,但 style="display: none" --> <div v-show="isShow">Hello</div>

2. 切换开销

特性v-ifv-show
初始渲染开销小(条件为 false 时不渲染)大(总是渲染)
切换开销大(销毁/重建元素)小(只改变 CSS)
编译条件惰性的(lazy)不惰性

3. 生命周期

v-if:

<template> <div v-if="isShow"> <ChildComponent /> </div> </template>
  • 条件为falsetrue:组件会创建,触发createdmounted等钩子
  • 条件为truefalse:组件会销毁,触发beforeUnmountunmounted等钩子

v-show:

  • 组件只会创建一次,生命周期钩子只触发一次
  • 切换时不会触发生命周期钩子

4. 其他区别

v-if:

  • 支持v-else-ifv-else
  • 支持<template>标签
  • 可以与v-for配合(但不推荐同时使用)

v-show:

  • 不支持v-else-ifv-else
  • 不支持<template>标签
  • 不能用于组件的根元素(某些情况)

使用场景

使用 v-if 的场景

适合以下情况:

  1. 条件很少改变
<div v-if="userRole === 'admin'"> 管理员面板 </div>
  1. 初始条件为 false,且可能永远不会变为 true
<div v-if="showAdvancedSettings"> 高级设置(大多数用户不会打开) </div>
  1. 需要懒加载组件
<HeavyComponent v-if="needLoad" />
  1. 条件渲染多个元素
<template v-if="isLoggedIn"> <div>欢迎回来</div> <button>退出</button> </template> <template v-else> <button>登录</button> </template>

使用 v-show 的场景

适合以下情况:

  1. 频繁切换显示/隐藏
<!-- 模态框、下拉菜单等 --> <div v-show="isModalOpen" class="modal"> 模态框内容 </div>
  1. Tab 切换
<div v-show="activeTab === 'tab1'">Tab 1 内容</div> <div v-show="activeTab === 'tab2'">Tab 2 内容</div> <div v-show="activeTab === 'tab3'">Tab 3 内容</div>
  1. 需要保持组件状态
<!-- 切换时保持表单输入状态 --> <form v-show="showForm"> <input v-model="formData.name" /> </form>
  1. 动画效果需要元素存在于 DOM
<transition> <div v-show="isVisible">带过渡效果的内容</div> </transition>

性能对比示例

<template> <div> <!-- 场景1:频繁切换 - 使用 v-show --> <button @click="toggle">切换</button> <div v-show="isShow"> 我会频繁切换(推荐 v-show) </div> <!-- 场景2:条件很少改变 - 使用 v-if --> <div v-if="userType === 'premium'"> 高级用户专属内容(推荐 v-if) </div> <!-- 场景3:大型组件懒加载 - 使用 v-if --> <HeavyChart v-if="showChart" /> </div> </template> <script> export default { data() { return { isShow: true, userType: 'premium', showChart: false } }, methods: { toggle() { this.isShow = !this.isShow // 频繁切换 } } } </script>

总结

简单记忆:

  • v-if:条件渲染,适合"要不要"的场景
  • v-show:显示切换,适合"显示/隐藏"频繁切换的场景

选择原则:

  • 运行时条件很少改变 → 使用v-if
  • 需要频繁切换 → 使用v-show
  • 需要懒加载或条件复杂 → 使用v-if
  • 需要保持状态或性能优化切换 → 使用v-show
http://www.jsqmd.com/news/144871/

相关文章:

  • 零基础也能行!5分钟用AI搞定PPT,和加班说再见
  • 【课程设计/毕业设计】基于springboot的考研在线学习与交流平台基于springboot的考研学生在线学习与交流系统的设计与实现【附源码、数据库、万字文档】
  • python识别图片验证码,最强验证码识别
  • 2025最新!9个AI论文平台测评:继续教育科研写作必备清单
  • Java计算机毕设之基于SpringBoot的在线学习交流系统设计与实现基于springboot的考研学生在线学习与交流系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 2026年AI战略落地:CIO分三阶段实施框架
  • 从0基础到完全掌握AD第12讲 栅格设置
  • 主管护师十大题库app排行榜:精选口碑题库,高效复习 - 资讯焦点
  • 通达信平步青云 源码
  • 【毕业设计】基于springboot的考研学生在线学习与交流系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 老板2026年AI规划实操指南:解决数据、人才、流程三大难题
  • 2026初级药师网课排行:考生亲测好评款 - 资讯焦点
  • 数字隔离器,如何提升光伏系统的运行稳定性?
  • Type-C受电端芯片ECP5702演示:串口发送电压电流,给外部MCU读取
  • 13、Vue2 与 Vue3 Diff 算法深度解析
  • Simbody: C++ 多体动力学(Multibody Dynamics)与物理仿真库
  • window10的wsl安装配置ubuntu22.04和docker
  • 离线自动标注 Occupancy:别再把“墙后面”当成空气了(附 3D Ray Casting 源码)
  • 【Java基础】AOP与注解
  • 文书生成Agent+案卷评查Agent+归纳分析Agent,推动烟草行业向更高效、更精准的方向演进
  • 14、Vue Mixin 源码分析与使用场景详解
  • 小家电Type-C受电端诱骗PD充电器获取5V9V12V15V20V供电--应用案例
  • 金融风控模型的鲁棒性验证:软件测试从业者的实践指南
  • 2026初级药师网课推荐:全套资源助力轻松通关 - 资讯焦点
  • 上海哪里可以开病例证明病假条
  • 学长亲荐10个AI论文软件,本科生搞定毕业论文格式规范!
  • 15、Vue 修饰符完全指南
  • PD协议诱骗芯片工作原理,Type-C充电器出不来电压是什么原因?
  • 医师资格证机构怎么挑?选对引路人轻松备考! - 资讯焦点
  • 2025最新!自考党必看10个AI论文工具测评与推荐