2021-09-20 09:23:57
在 Vue.js 中,v-show 和 v-if 都是用于条件渲染元素的指令,但它们在工作原理和性能影响方面存在显著区别。以下是它们的核心差异:
1. 工作原理v-show通过动态切换元素的 display 样式属性(display: none 或 display: block)来控制显示/隐藏。元素始终存在于 DOM 中,只是通过 CSS 隐藏。
v-if通过条件判断直接插入或删除元素。当条件为 false 时,元素会从 DOM 中移除;条件为 true 时重新创建并插入。
v-show
优点:
性能开销低:无需销毁/重建元素,适合频繁切换的场景(如选项卡、折叠面板)。
立即响应:切换时仅修改样式,渲染速度快。
缺点:
保留 DOM 空间:隐藏的元素仍占据布局空间,可能影响页面布局。
潜在闪烁:若依赖 CSS 过渡(如 transition),可能因样式变化导致视觉闪烁。
v-if
优点:
避免闪烁:元素直接插入/删除,无中间过渡状态。
影响布局流:删除的元素不占空间,适合需要动态调整布局的场景。
缺点:
高开销:频繁切换时会反复销毁和重建元素,可能引发性能问题。
状态丢失:若元素内部有状态(如表单输入),切换后状态会重置。
优先用 v-show:
需要频繁切换显示/隐藏(如响应式导航菜单、动态表单)。
元素渲染成本较低(无复杂子组件或大量数据)。
优先用 v-if:
条件很少改变(如用户权限控制、初始化时隐藏的模块)。
需要严格避免布局抖动或闪烁问题。
元素包含复杂逻辑或子组件,希望在隐藏时完全卸载以释放资源。
根据具体场景(性能、布局、交互频率)选择合适的指令,可以显著优化应用体验。