v-if 和 v-show 有什么区别?

本文详细解析了Vue.js中v-if与v-show指令的区别,包括它们的实现方式、编译过程、编译条件及性能消耗等方面。指出v-if通过条件判断来移除或插入DOM节点,而v-show则是通过修改CSS的display属性来实现元素的显示与隐藏。

请问 v-if 和 v-show 有什么区别?
a.实现方式: v-if是根据后面数据的真假值判断直接从Dom树上删除或重建元素节点。 v-show只是在修改元素的css样式,也就是display的属性值,元素始终在Dom树上。

b.编译过程:v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件; v-show只是简单的基于css切换;

c.编译条件:v-if是惰性的,如果初始条件为假,则什么也不做;只有在条件第一次变为真时才开始局部编译; v-show是在任何条件下(首次条件是否为真)都被编译,然后被缓存,而且DOM元素始终被保留;

d.性能消耗:v-if有更高的切换消耗,不适合做频繁的切换; v-show有更高的初始渲染消耗,适合做频繁的额切换;

### 条件渲染方式不同 `v-if` 是真正的条件渲染,会根据表达式的真假来销毁或重新创建 DOM 元素及其内部的 Vue 组件。当条件为 `false` 时,元素及其内部的 Vue 组件会被完全销毁,通俗地讲就是将该标签直接从 DOM 中移除,因此在 DOM 中不会存在。这种方式适合在运行时条件很少改变的情况,或者在条件改变时希望销毁重建 DOM 的场景 [^2]。 `v-show` 则通过简单地切换 CSS 的 `display` 属性来控制元素的显示与隐藏。当条件为 `false` 时,元素在 DOM 中仍然存在,只是通过 CSS 控制不显示(即将 `display` 设置为 `none`)。由于它不会销毁重建 DOM,只是简单地切换 CSS 属性,因此适合在需要频繁切换显示状态的情况下使用 [^2]。 ### 性能比较 `v-if` 在条件切换时会销毁重建 DOM,可能会带来较大的性能开销,特别是在条件频繁变化时 [^2]。此外,由于 `v-if` 是惰性渲染,当条件为 `false` 时,元素不会被渲染到 DOM 中,从而减少了初始渲染的开销 [^3]。 `v-show` 不会销毁重建 DOM,而是在初始渲染时就将元素渲染到 DOM 中,并通过 CSS 控制其显示状态。因此,`v-show` 在频繁切换显示状态时性能表现更好,但由于其总是会渲染,初始渲染时会有更高的开销 [^3]。 ### 使用场景选择 如果需要在运行时条件很少改变,或者在条件切换时希望销毁重建 DOM 元素,可以选择 `v-if`。例如,权限控制场景下,某些元素仅在特定权限下才需要存在,这种情况下使用 `v-if` 更合适 [^2]。 如果需要频繁切换元素的显示状态,或者需要保留组件的状态(如表单输入值),则更适合使用 `v-show`。由于 `v-show` 只是通过 CSS 控制显示与隐藏,不会触发生命周期的销毁与重建,因此在频繁切换时性能更优 [^2]。 ### 总结对比 | 特性 | `v-if` | `v-show` | |------|--------|----------| | DOM 操作 | 移除/添加 DOM 元素 | 切换 `display` 属性 | | 组件生命周期 | 触发销毁/重建 | 不触发生命周期变化 | | 初始渲染 | 惰性渲染 | 总是渲染 | | 适合场景 | 不频繁切换、需要销毁重建 | 频繁切换、需要保留状态 | ### 示例代码 ```html <!-- v-if 示例 --> <template> <div> <p v-if="isVisible">这段文字通过 v-if 控制显示</p> </div> </template> <script> export default { data() { return { isVisible: true }; } }; </script> ``` ```html <!-- v-show 示例 --> <template> <div> <p v-show="isVisible">这段文字通过 v-show 控制显示</p> </div> </template> <script> export default { data() { return { isVisible: true }; } }; </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值