2.5 条件
html并没有提供条件和循环的逻辑,例如根据某个变量的值,显示不同的内容。vue的解决办法是这样的:
<div id="app"> <p v-if="username"> 你好,{{username}},欢迎回到我们大家庭,你之前访问的页面是{{userPage}} </p> <p v-else> 请登录 </p> <input type="text" v-model="textValue"/> <div> {{textValue}} </div> <img alt="Vue logo" src="./assets/logo.png"> <HelloWorld msg="欢迎来到我的第一个vue项目"/> <div v-html="html"> </div></div>
v-if是一个判断,username的值不为空值则显示后面欢迎的话,否则显示v-else的部分,也就是“请登录”。
接下来我们把username的值设置为空,就能测试是否生效了。
上面的例子里,如果需要它的子元素受条件控制,而它本身又不出现,该怎么办呢?例如下面的代码,2、3、4行代码是否出现,取决于变量ok是否有值:
<template v-if="ok"> <h1>Title</h1> <p> Paragraph 1 </p> <p> Paragraph 2 </p></template>
template将不会出现,它控制内部的元素是否显示。
你可以使用 v-else 指令来表示 v-if 的“else 块”:
<div v-if="Math.random() > 0.5"> 你能看到我</div><div v-else> 现在你看不到我了</div>
else前面必须有if,它本身的意思是否则,假如都没有“如果”,何来否则。除此之外,还有一个v-else-if,相当于else 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-if比较类似的v-show
<h1 v-show="ok">Hello!</h1>
它的用法和v-if基本一样,但是它没有else,也不支持template。那么这两者的区别是什么呢?
最主要的区别就是:不管条件是否成立,v-show的元素必定会渲染,如果条件不成立,那么就用display:none隐藏起来;v-if则是根据条件决定是否渲染,如果不成立,这个元素是根本不存在的。
那么怎么使用它们就比较清晰了,如果经常需要来回切换元素是否显示的,那么使用v-show;否则就使用v-if。因为v-show一旦渲染完了,切换的时候修改display就可以了,而v-if切换要重新载入或者删除元素,开销更大。
现在用v-show替换掉上面的代码,那么就是这么写的:
<div id="app"> <p v-if="username"> 你好,{{username}},欢迎回到我们大家庭,你之前访问的页面是{{userPage}} </p> <p v-else> 请登录 </p> <p v-show="username"> 你好,{{username}},欢迎回到我们大家庭,你之前访问的页面是{{userPage}} </p> <p v-show="username==''"> 请登录 </p> <input type="text" v-model="textValue"/> <div> {{textValue}} </div> <img alt="Vue logo" src="./assets/logo.png"> <HelloWorld msg="欢迎来到我的第一个vue项目"/> <div v-html="html"> </div></div>
如果这个方式显示的,我们可以看到两个都显示出来了:
但如果我们检查html原始,会发现“请登录”其实也在(它是上面第5行代码的v-show生成的),只是用display:none隐藏了,这就是v-show:它仍然会生成,但是否显示就看条件,条件不成立不显示