本文对比 v-if
、v-show
、display: none
、opacity: 0
、visibility: hidden
以及 React 条件渲染的差异,帮你彻底掌握它们的适用场景!
特性 | 是否在 DOM 树 | 是否在渲染树 | 是否触发生命周期 | 是否影响布局 |
---|---|---|---|---|
v-if / React && |
❌ | ❌ | ✔️ | ❌ |
display: none |
✔️ | ❌ | ❌ | ❌ |
visibility: hidden |
✔️ | ✔️(不绘制) | ❌ | ✔️ |
opacity: 0 |
✔️ | ✔️ | ❌ | ✔️ |
v-if
(条件渲染)<div v-if="isVisible">条件为 false 时完全移除 DOMdiv>
created
/mounted
/destroyed
生命周期。v-show
(CSS 隐藏)<div v-show="isVisible">始终在 DOM 中,仅切换 display: nonediv>
v-if
(无 DOM 操作)。display: none
.hidden { display: none; }
visibility: hidden
.invisible { visibility: hidden; }
opacity: 0
.transparent { opacity: 0; }
v-if
){isVisible && <div>条件为 false 时移除 DOMdiv>}
useEffect
清理函数或 componentWillUnmount
。v-show
)<div style={{ display: isVisible ? "block" : "none" }}>
始终在 DOM 中,仅隐藏
div>
方式 | 框架/原生 | DOM 存在性 | 渲染树参与 | 可交互性 | 生命周期 | 适用场景 |
---|---|---|---|---|---|---|
v-if |
Vue | ❌ | ❌ | ❌ | ✔️ | 低频条件渲染 |
v-show |
Vue | ✔️ | ❌ | ❌ | ❌ | 高频切换(如选项卡) |
display: none |
CSS | ✔️ | ❌ | ❌ | ❌ | 彻底隐藏且不占空间 |
visibility: hidden |
CSS | ✔️ | ✔️(不绘制) | ❌ | ❌ | 隐藏但保留布局 |
opacity: 0 |
CSS | ✔️ | ✔️ | ✔️ | ❌ | 透明动画/隐藏但可点击 |
{condition && |
React | ❌ | ❌ | ❌ | ✔️ | 条件渲染(类似 v-if ) |
opacity: 0
+ CSS Transition。visibility: hidden
。v-if
或 React &&
。v-show
或 display: none
。v-if
或 React 条件渲染。v-show
、display: none
或 opacity: 0
。v-show
,但用 display: none
轻松实现同样效果!希望这份指南能帮你彻底理清前端隐藏元素的奥秘!