当前位置: 首页 > 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.gsyq.cn/news/159290.html

相关文章:

  • 2026年AI战略落地:CIO分三阶段实施框架
  • 通达信平步青云 源码
  • 2026初级药师网课排行:考生亲测好评款 - 资讯焦点
  • 金融风控模型的鲁棒性验证:软件测试从业者的实践指南
  • 【Java基础】AOP与注解
  • 离线自动标注 Occupancy:别再把“墙后面”当成空气了(附 3D Ray Casting 源码)
  • 14、Vue Mixin 源码分析与使用场景详解
  • AI论文生成器测评:6款工具实测,20分钟生成万字问卷类论文+真实参考文献,哪款最靠谱?
  • 2025最新!自考党必看10个AI论文工具测评与推荐
  • 2026年CIO做AI规划时的3个关键点
  • 智能体进化方向:Skill即场景,Skill即产品
  • 医师资格证优质机构选择干货 专业建议助你择优 - 资讯焦点
  • AI聊天高手的五招秘传:让大模型从话痨变智者
  • Comsol微小倾斜造就极致手性:连续体束缚态内秉手性的探究
  • 高效能10款项目管理系统排行榜:高效率运转的核心利器
  • 空气能行业2025年度十大品牌权威榜单总结 - 资讯焦点
  • 十大超群2025项目管理工具盘点:非凡实力提升协作效率
  • 哪个品牌的高光谱分选仪好?2026年国产和国际厂家品牌推荐 - 品牌推荐大师
  • 【无人机三维路径规划】基于A_Satr结合天牛算法BAS野外环境下考虑模态切换点优化的3D路径规划附Matlab代码和报告
  • 为什么你学了很多却依然做不好决策?
  • 2026(副)主任护师黄金复习法则:三大高效复习经验分享 - 资讯焦点
  • 医师资格证报考机构优择指南 助力高效备考拿证 - 资讯焦点
  • 移动互联网生态下定制开发开源AI智能名片S2B2C商城小程序源码在营销技术中的应用与发展
  • JavaScript性能优化实战:从入门到精通
  • ue 操作 metahuman
  • 跨越进程的对话之从管道到gRPC的通信技术演进
  • 2025年艺术涂料品牌大比拼,谁才是你的装修优选?环保艺术涂料/水性艺术涂料/墙面艺术漆,艺术涂料品牌怎么选择 - 品牌推荐师
  • 不得了!湖北天玑AIGEO优化系统重磅推广!
  • 43、【Ubuntu】【Gitlab】拉出内网 Web 服务:静态动态服务 - 详解
  • 基于SpringBoot的设计师约稿平台 呢_jye277e8