vue学习-v-if和v-show

本文详细解析了Vue.js中v-if与v-show指令的区别,包括它们的工作原理、性能考量及适用场景。v-if实现真正的条件渲染,适用于条件不常变动的情况;v-show通过CSS控制显示,适合频繁切换。

v-if

v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。

v-show

v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 CSS property display。

区别

1、v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

2、v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。display:none,会引发回流

3、一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。
这几句话已经涵盖网页所有的v-if和v-show的区别

Vue 2 中,`v-if` `v-show` 都用于条件性地渲染 DOM 元素,但它们的实现方式使用场景有显著区别。下面详细解释两者的差异,并提供代码示例。 --- ### ✅ 区别总结: | 特性 | `v-if` | `v-show` | |------------------|--------------------------------------|-------------------------------------| | 渲染行为 | **惰性渲染**:条件为真时才创建元素 | **始终渲染**:元素始终存在于 DOM 中 | | DOM 存在性 | 条件为假时,元素从 DOM 中**移除** | 条件为假时,元素通过 `display: none` 隐藏 | | 初始渲染开销 | 较高(可能需要重新创建) | 低(只是切换样式) | | 频繁切换性能 | 差(频繁销毁/重建) | 好(仅 CSS 切换) | | 是否支持 `<template>` | 支持 | 不支持 | | 是否响应式更新 | 是 | 是 | --- ### 🧪 示例代码 ```html <template> <div> <!-- 使用 v-if --> <div v-if="showWithIf"> 这个元素使用 v-if 控制,false 时不会在 DOM 中存在 </div> <!-- 使用 v-show --> <div v-show="showWithShow"> 这个元素使用 v-show 控制,false 时 display: none </div> <!-- 按钮控制显示 --> <button @click="toggle">切换显示</button> </div> </template> <script> export default { data() { return { showWithIf: false, showWithShow: false }; }, methods: { toggle() { this.showWithIf = !this.showWithIf; this.showWithShow = !this.showWithShow; } } }; </script> <style> /* 可以观察到 v-show 的元素一直存在,只是样式变化 */ div[style*="display: none"] { color: gray; } </style> ``` --- ### 🔍 解释说明: - `v-if` 是“真正”的条件渲染: - 当 `showWithIf` 为 `false` 时,该 `<div>` **完全不会被渲染到 DOM 中**。 - 第一次变为 `true` 时,Vue 才会创建并挂载这个元素。 - 适合:**不常切换**的场景,如权限控制、初始加载判断等。 - `v-show` 是“伪隐藏”: - 元素**始终被渲染**,只是通过 `style="display: none"` 来控制可见性。 - 切换非常快,因为没有组件生命周期的开销。 - 适合:**频繁切换**的场景,如折叠面板、开关动画等。 > ⚠️ 注意:`v-show` 不能用在 `<template>` 上,而 `v-if` 可以。 --- ### 💡 相关建议 - 如果你想减少初始渲染负担,用 `v-if`。 - 如果你要频繁切换显示状态,用 `v-show`。 - `v-if` 可与 `v-else` 或 `v-else-if` 搭配使用,`v-show` 不行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值