vue-条件渲染

166 阅读3分钟

v-if 指令

v-if 指令可以用于在满足特定条件时渲染一块内容。只有在指令的表达式返回 truthy 值时,这块内容才会被渲染。

<h1 v-if="awesome">Vue is awesome!</h1>

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

另外,v-if 可以作为属性或组件根节点使用,此时不要求必须有模板标签。

<div v-if="ok">
    <p>Paragraph 1</p>
    <p>Paragraph 2</p>
</div>

v-else 和 v-else-if 指令

v-else 指令用于表示 v-if 的“else 块”。它必须紧跟在带 v-if 的元素的后面。

<div v-if="Math.random() > 0.5">Now you see me</div>
<div v-else>Now you don't</div>

v-else-if 指令可以充当 v-if 的“else-if 块”,可以连续使用。它也必须紧跟在带 v-if 的元素之后。

<div v-if="type==='A'">A</div>
<div v-else-if="type==='B'">B</div>
<div v-else-if="type==='C'">C></div>
<div v-else>Not A/B/C</div>

注意,v-else 和 v-else-if 元素必须要有明确的父元素。

用 key 管理可复用的元素

Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做除了使 Vue 变得非常快之外,还有其它一些好处。例如,如果你允许用户在不同的登录方式之间切换:

<template v-if="loginType==='username'">
    <label>Username</label>
    <input placeholder="Enter your username">
</template>
<template v-else>
    <label>Email</label>
    <input placeholder="Enter your email address">
</template>

上面的代码中切换 loginType 将不会清除用户已经输入的内容。因为两个模板使用了相同的元素,<input>不会被替换掉——仅仅是替换了它的 placeholder。但是如果你想让 Vue 对这两个输入元素进行完全独立的操作,那么可以给它们添加一个具有唯一值的 key attribute:

<template v-if="loginType==='username'">
    <label>Username</label>
    <input placeholder="Enter your username" key="username-input">
</template>
<template v-else>
    <label>Email</label>
    <input placeholder="Enter your email address" key="email-input">
</template>

v-show和v-if

当使用 v-show 时,元素始终会被渲染并保留在 DOM 中。v-show 通过切换元素的 CSS display 属性来简单地控制元素的显示和隐藏。要注意的是,v-show 不支持 <template> 元素,也不支持 v-else

另一方面,v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。这意味着当条件块在切换时,只有满足条件的元素会被重新渲染。v-if 是惰性的,即在初始渲染时如果条件为假,那么什么也不做,直到条件第一次变为真时,才会开始渲染条件块。

需要注意的是,v-ifv-for 一起使用时,因为 v-for 会对每个元素进行独立的判断,所以具有比 v-if 更高的优先级。在进行内容优化时,可以根据实际需要选择使用 v-show 还是 v-if。如果需要频繁切换元素的显示和隐藏,那么使用 v-show 更好;如果运行时条件很少改变,那么使用 v-if 更好。这样可以优化切换开销和初始渲染开销,提高性能。

总的来说,选择使用 v-show 还是 v-if 取决于具体的应用场景和性能需求。如果需要频繁切换显示和隐藏可以使用 v-show ,而如果条件很少改变则可以使用 v-if