![Vue.js企业开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/909/44509909/b_44509909.jpg)
2.2 条件渲染
2.2.1 v-show
v-show指令可以根据条件展示元素,代码如下:
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P32_26326.jpg?sign=1739595929-11HEiCoaGNecrCiAerTdPUcSRIhi86eO-0-b9bdde0f0b144591b379b150b5aca5ea)
带有v-show的元素始终会被渲染并保留在DOM中,v-show只是通过简单地切换元素CSS属性display:none实现的。例如,将上面的代码v-show的值设置为false,代码如下:
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P32_26327.jpg?sign=1739595929-ZoL4jUTo05swkGUMLXkEmSZaBbqh8bPx-0-1862f919b571863ccaeab88dc7df05dc)
在浏览器中运行的效果如图2.6所示。
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P32_24500.jpg?sign=1739595929-KHKy0abk5z8MpczQPT2QGcjfTOPN3iSk-0-36db1e747d31df7c7a6b129b4ea4f07d)
图2.6 v-show在浏览器中运行的效果
2.2.2 v-if与v-else-if
v-if和v-show都可以实现条件渲染,但是v-if与v-show不同的是,v-if不是通过切换CSS属性实现显示与隐藏的,当v-if的值为false时,带有v-if的DOM元素就不会被渲染出来。v-if和v-show最大的不同就是,v-if不仅可以单独使用,还可以和v-else-if、v-else指令配合使用,类似于JavaScript中的if-else、if-else-if语句。
1.v-if
v-if用于条件性地渲染一部分内容。这部分内容只会在指令的表达式返回值为true的时候才被渲染。
index.html文件代码如下:
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P33_26330.jpg?sign=1739595929-fK9SQgEczBVKx6EaaifllZ5EEySQIbev-0-15a70e70cd0b0602899ab97247ae69ca)
在浏览器中运行的效果如图2.7所示。
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P33_4391.jpg?sign=1739595929-FZdYx6YpZs3Kzkl66TPTehzDMpmXBD3f-0-b303f15e757e830ec30f6da8388e75d4)
图2.7 v-if在浏览器中运行的效果
2.v-else-if
v-else-if指令类似于条件语句中的“else-if块”,可以与v-if配合使用。
index.html文件代码如下:
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P34_26332.jpg?sign=1739595929-puhPUlV0XswvMNZoKt57goG2N7b0HQNs-0-888b5c12e11dcc0a431c415028802fd2)
上面代码在浏览器中运行的结果为B,这里需要注意的是,v-else-if指令不能单独使用,必须跟在带有v-if或v-else-if的元素之后。
3.v-if和v-show的区别
v-if与v-show指令都可以根据表达式的值来控制元素的显示与隐藏状态。
v-if相比于v-show,更“真实”地实现了元素的渲染与移除,但是在频繁的切换过程中,使DOM元素不断地在内存中重建与销毁,这样便增加了内存的开销。
v-show是更简单的一种切换显示与隐藏状态的操作,只是修改了CSS属性中display的值,无论显示与隐藏,DOM元素始终被渲染。
综上所述,如果需要在页面中频繁地切换某个元素的显示状态,推荐使用v-show指令;如果在运行时条件很少改变,则推荐使用v-if指令。
2.2.3 v-else
在根据条件渲染DOM元素时,还可以使用v-else指令来表示“else块”,类似于JavaScript中的if-else逻辑语句。
index.html文件代码如下:
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P34_26335.jpg?sign=1739595929-MRh9N9hXjq649sFy4vhK38lRnu5HGRns-0-97a80c3eb4c143161738ddae02b94426)
在浏览器中运行的效果如图2.8所示。
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P35_4550.jpg?sign=1739595929-vA5U4qLu5sIIyjEuBCpVF5tyykbGr2dy-0-2d6e70c6971dd85e025ab8aef47f87f3)
图2.8 v-else指令在浏览器中运行的效果
2.2.4 在<template>元素上使用v-if条件渲染分组
因为v-if是一个指令,所以必须将它添加到一个元素上。但是如果想切换多个元素应该如何操作呢?此时可以把一个<template>元素当作不可见的包裹元素,并在上面使用v-if。最终的渲染结果将不包含<template>元素。
index.html文件代码如下:
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P35_26336.jpg?sign=1739595929-XJ1lAPvmOyY9Ldx2qRAtpMFYQStTDcg6-0-240e10ccd5f92c1e756efcee0ba20b65)
在浏览器中运行的效果如图2.9所示。
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P36_4663.jpg?sign=1739595929-K3avOmoclGNe3tcWOsfzU3diIbqzBJNI-0-a91e9c703e4b793b9baaae0953ab3175)
图2.9 在<template>元素上使用v-if条件运行的效果
2.2.5 用key管理可复用的元素
Vue会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这样做除了使Vue的执行速度变得非常快之外,还有其他一些作用。例如,允许用户在不同的登录方式之间切换。
index.html文件代码如下:
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P36_26337.jpg?sign=1739595929-GqQsq9NhYBjyoABw4Xbkt6hyNw0uO4gV-0-0b738f90469493c18e3e9490e8c39ef1)
在浏览器中运行,首先在输入框中输入“张三”,如图2.10所示,然后单击“切换”按钮,可以看到邮箱中显示的是“张三”,如图2.11所示。
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P37_4782.jpg?sign=1739595929-36WdnLB6wiDuL5YLPt9M32WCJh7HS8FF-0-75c063df289bc5e8efd9f441fc610cc6)
图2.10 输入“张三”
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P37_4785.jpg?sign=1739595929-8Kpebv3qOMZKz93xXB7VT7s3H7vPhaUw-0-da0969b14a3d30c5f20b549023ced8e1)
图2.11 切换效果
在上面的示例中,切换状态并不会清空用户已经输入的内容,因为两个模板使用了相同的元素,<input>不会被替换掉,只是替换了它的placeholder属性。
这样也不总是符合实际需求,所以Vue提供了一种方式来表达“这两个元素是完全独立的,不要复用它们”。只需添加一个具有唯一值的key属性。
index.html文件代码如下:
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P37_26340.jpg?sign=1739595929-m0LA3QQvxoCbuE25nXdVqVXpxVA7XYsJ-0-3f6be42a38040cc544309ff71d048a53)
在浏览器中运行,首先在输入框中输入“张三”,如图2.12所示,然后单击“切换”按钮,可以看到邮箱中的值为默认的placeholder属性的值,如图2.13所示。
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P38_26354.jpg?sign=1739595929-laHEVwJ0vTJzLYBQ4HSJdekAn1Or3pFG-0-dc6a2958fc8068d22677d2def79da90c)
图2.12 输入“张三”
![](https://epubservercos.yuewen.com/85E887/23721628409520006/epubprivate/OEBPS/Images/Figure-P38_26357.jpg?sign=1739595929-6V23JYqaZEhCq78FzZHvykbJDfGLkZPM-0-1e786eaaf600d725bd7895251c70e56f)
图2.13 切换效果