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

v-show 和 v-if 的区别及使用场景

v-show 和 v-if 的区别及使用场景

一、v-show 与 v-if 的共同点

两者都能控制元素在页面中的显示与隐藏(不包括 v-else 情况),且用法相同:

<Model v-show="isShow" />
<Model v-if="isShow" />

当表达式为 true 时,元素都会占据页面位置;为 false 时,都不会占据位置。

二、v-show 与 v-if 的区别

  1. 控制方式不同

    • v-show 通过添加 CSS display: none 隐藏元素,DOM 元素依然存在
    • v-if 会直接添加或删除整个 DOM 元素
  2. 编译过程不同

    • v-if 有局部编译/卸载过程,会销毁和重建内部事件监听及子组件
    • v-show 仅进行简单的 CSS 切换
  3. 生命周期影响

    • v-show 状态变化不会触发组件生命周期
    • v-if 从 false 变为 true 会触发 beforeCreate、created、beforeMount、mounted 钩子;从 true 变为 false 会触发 beforeDestroy、destroyed
  4. 性能消耗

    • v-if 切换开销更大
    • v-show 初始渲染开销更大

三、实现原理分析

v-show 原理

无论初始条件如何,元素都会被渲染。其实现逻辑:

  1. 有 transition 时执行 transition 动画
  2. 无 transition 时直接设置 display 属性
// Vue 3 的 v-show 指令实现
export const vShow: ObjectDirective<VShowElement> = {// 在元素挂载到 DOM 之前执行beforeMount(el, { value }, { transition }) {// 保存元素的原始 display 值,用于后续恢复// 如果当前是隐藏状态(display: none),则保存空字符串// 否则保存当前的 display 值el._vod = el.style.display === 'none' ? '' : el.style.display// 如果存在过渡动画且值为真(显示元素)if (transition && value) {// 执行过渡动画的进入前钩子transition.beforeEnter(el)} else {// 否则直接设置元素的显示状态setDisplay(el, value)}},// ...其他生命周期处理(如 mounted, beforeUpdate, updated, beforeUnmount 等)}

v-if 原理

实现更为复杂,根据表达式值决定是否生成 DOM:

// Vue 3 的 v-if 指令转换器
export const transformIf = createStructuralDirectiveTransform(// 匹配 v-if、v-else、v-else-if 指令的正则表达式/^(if|else|else-if)$/,// 转换函数,处理条件指令的 AST 节点(node, dir, context) => {// 调用 processIf 函数处理条件分支逻辑return processIf(node, dir, context, (ifNode, branch, isRoot) => {// 条件分支处理逻辑// ifNode: 当前处理的 if 节点// branch: 当前分支(if/else-if/else)// isRoot: 是否为根节点})})

四、使用场景建议

  1. 频繁切换场景 推荐使用 v-show
    适用于需要快速响应的交互元素:
  • Tab 切换内容
  • 下拉菜单/折叠面板
  • 频繁开闭的 Modal 弹窗
  1. 静态条件场景 推荐使用 v-if
    适用于内容较重且不常变更的情况:
  • 根据用户角色/权限加载的初始页面模块
  • 登录状态相关的按钮/导航栏切换
  • 大数据列表/图表等按需加载的组件
http://www.dtcms.com/a/391658.html

相关文章:

  • 动态二维码杜绝代签,手机端配置同步,巡检数据更可靠
  • 数据库学习MySQL系列6、MySQL入门简单练习使用
  • 交互式生成对抗网络(iGAN)
  • RecSys: 推荐系统重排与多样性优化(MMR以及DPP算法)
  • 瑞芯微MPP音视频框架---mjpeg解码
  • 模型部署:(七)安卓端部署OCR文本识别项目全流程记录
  • 用html5写一个超级计算器
  • 手机实现真随机数生成器
  • 119.计数器产生中断(上升沿)计算方法,比如cnt[21:0],那么assign time = cnt[20]这样大致是多长时间产生一次中断
  • VSCode c/c++头文件函数点击无法跳转问题
  • `mysql_real_connect` 函数全面深度解析
  • 深入解析Yum元数据安全与Artifactory自动化原理
  • 第三章 强化学习助力优化
  • 使用角色和Ansible内容集合简化Playbook
  • 鸿蒙应用集成Push Kit 指南
  • 树莓派ubuntu20.04实现ROS noetic与Arduino通信
  • 【代码随想录算法训练营——Day17】二叉树——654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
  • 托福听力44
  • C++——STL
  • 「ECG信号处理——(25)基于ECG心率变异性(HRV)与EDA皮肤电活动的生理状态分析」2025年9月19日
  • 高通camx架构学习(四)——Camera Framework
  • 接口安全攻防战:从入门到精通的全方位防护指南
  • GEO(Generative Engine Optimization)技术详解与2025实践指南
  • Amazon SES 移出沙盒完整指南 高通过率模板
  • 从 IP over 鸽子到 TCP 的适应性
  • 大模型提示工程
  • 鸿蒙应用开发——Repeat组件的使用
  • 远程控制的全球节点功能如何开启?插件类型、并发数量怎么选?
  • 因果推断:因果回归树处理异质性处理效应(三)
  • 六应用层-真题