v-if
的用法详解v-show
的用法v-if
与v-show
的用法比较v-if
与v-for
联合使用的建议
v-if
在字符串模板里,例如 Handlebars,我们像这样写一个条件模块:
<!-- Handlebars template -->
{{#if ok}}
<h1>Yes</h1>
{{/if}}
在Vue我们使用v-if
指令做相同的实现:
<h1 v-if="ok">Yes</h1>
使用v-else
去添加else语句块
<h1 v-if="ok">Yes</h1>
<h1 v-else>No</h1>
在template上使用v-if
v-if
可以实现给一个元素,但如果你想作用于多个元素,我们可以在元素上使用v-if
做一个不可见的封装。最终渲染的结果不包含元素.
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
v-else
你也能够使用v-else
指令去为v-if
表示一个else语句块:
<div v-if="Math.random() > 0.5">
Now you see me
</div>
<div v-else>
Now you don't
</div>
注意:一个v-else
元素必须紧跟着一个v-if
或v-else-if
元素。否则它将不被识别。
v-else-if
New in 2.1.0+
v-else-if
服务于v-if
的否则如果语句块。可以连续写多个。
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
A
</div>
<div v-else-if="type === 'C'">
A
</div>
<div v-else>
Not A/B/C
</div>
类似于v-else
,一个v-elese-if
元素必须紧跟在v-if
或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>
填写输入框:
点击Toggle login type按钮切换输入框
切换loginType
的时候已经录入的信息不会被擦除,因为两个模板使用相同的元素,没有被替换,仅仅替换了placeholder
.
如果我们不复用他们,那么需要增加一个key属性,并给一个唯一值:
<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>
填写输入框:
点击Toggle login type切换按钮:
输入框每一次都会被重新开始渲染,
v-show
v-show
也是一个条件显示的指令。用例与v-if
大致相同:
<h1 v-show="ok">Hello!</h1>
不同之处是v-show
总是会显示在DOM中;v-show
仅能触发CSS元素的display
属性。
注意:
v-show
元素不支持元素,也对v-else
不起作用。
v-if
vs v-show
v-if
它会确定事件监听在条件为真的时候渲染,子组件在被添加的语法块内被相应的销毁和创建。
v-if
也是懒加载的,如果在初始化渲染期间条件是false,它不会做任何事情-直到条件变为真的时候才会被重新渲染。
相比之下,v-show
是更简单的-不管初始条件如何元素总是被渲染,基于CSS触发。
通常来说,v-if
有更高的触发成本,v-show
有更高的初始化渲染成本。如果你需要经常切换,那么使用v-show
,如果条件在运行时不可能改变则使用v-if
.
在v-if
与v-for
不推荐
v-if
和v-for
一起使用。可以进一步看 style guide
当和v-if
一起使用的时候,v-for
有更高的优先级。详情看 list rendering guide 。