V-if跟V-show的区别

本文通过实例对比分析了Vue中v-if与v-show指令的使用场景及性能差异。v-show通过改变display属性控制元素显示,适用于频繁切换的情况;而v-if则将元素从DOM树中移除,适合不频繁切换的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信很多vue的初学者都对这两个指令的文档说明一脸懵逼,我刚开始的时候也是,下面就直接用一个例子来做一个最直观的表达.

用过这两个指令的都知道这两个指令是控制元素的显示跟隐藏,我也就不再过多介绍这两个指令的用法了,直接上代码吧

    <style>
        img{
            width: 200px;
        }
    </style>
</head>
<body>
        <div id="app">
                <input type="button"  value="点击图片显示隐藏" @click='isShow = !isShow'>
                <img src="./img/1.png"  v-show="isShow" alt="">
                //第一张照片用的是v-show
                <img src="./img/2.png" v-if='isShow' alt="">
                //第二张照片用的是v-if
                
         </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app = new Vue({
        el:'#app',
        data:{
            
            isShow:true
        },
     
    })
</script>

在这里插入图片描述
接下来点击按钮让他们隐藏
在这里插入图片描述

	**现在可以得出一个结论:
	 v-show:
        操纵display 为 none 或者block 元素在dom树中还是存在的
        适用情况:
            因为操纵dom树比较耗性能,所以如果元素需要频繁的切换显示和隐藏 一般 使用v-show
    v-if:
        会把元素从dom树中移除,是真的没有了
        使用情况:
            不是频繁切换显示和隐藏,可以使用v-if**
### Vue.js 中 `v-if` 与 `v-show` 指令详解 #### 功能描述 - **`v-if`**: 这是指令用于条件性渲染元素。当表达式的值为假时,该指令会彻底移除 DOM 节点;反之,则将其添加到 DOM 中[^1]。 - **`v-show`**: 此指令则是通过 CSS 的 display 属性来控制元素的可见性。无论初始状态是什么样的,它都会被渲染成真实节点并保持在页面文档对象模型 (DOM) 结构内,仅改变其样式属性使之不可见或可见[^2]。 #### 差异分析 ##### 渲染方式的不同 - 对于 `v-if` 来说,在首次加载组件时如果判断条件不满足,则不会创建对应的虚拟 DOM 及关联的真实 DOM 元素,直到条件变为真才会执行挂载操作。 - 相较之下,`v-show` 不论条件真假都先完成整个 HTML 文档结构建立过程,之后再依据设定调整样式的 visibility 或者其他形式达到视觉上的隐藏效果[^3]。 ##### 初始编译成本对比 由于 `v-if` 需要根据实际情况决定是否生成特定部分的内容,因此初次渲染过程中可能涉及更多的计算开销——尤其是在复杂模板里存在多个嵌套层次的情况下。而 `v-show` 几乎总是会产生相同的编译代价,因为它始终会对所有潜在目标做处理而不关心最终呈现与否[^4]。 #### 使用场景建议 考虑到上述特性: - 如果某些 UI 片段只会在少数情况下展示出来,并且切换频率较低的话,推荐采用 `v-if` 实现按需加载逻辑; - 当面对频繁变动的状态变化需求时(比如按钮点击后立即显现/消失),则更适合选用 `v-show` 方案以减少不必要的重绘和布局抖动现象[^5]。 ```html <!-- 示例代码 --> <div id="app"> <!-- 使用 v-if 控制显示 --> <p v-if="seen">现在你看到我了</p> <!-- 使用 v-show 控制显示 --> <p v-show="seen">我现在也出现了</p> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2"></script> <script> new Vue({ el: '#app', data() { return { seen: true } } }) </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值