控制元素可见性的指令 v-if 和 v-show

  • v-if
  • v-else
  • v-else-if :多重判断
  • template :分组渲染包裹元素
  • key:管理可复用元素
  • v-show
  • v-ifv-show的区别
  • v-if=expressionv-show=expressiontruthyfalsy真假值

v-if 指令

v-if="value"当value为真值时,绑定的元素显示;为假值时,绑定的元素不会被写入页面。

假值falsy包括`false` , `nudefined`, `null`, `NaN`, `""`,除此为真值truthy
<div id="example">
<p v-if="isMorning">Good morning</p>
<p v-if="isAfternoon">Good afternoon</p>
<p v-if="isEvening">Good evening</p>
</div>
<script>
var hours = new Date().getHours();
new Vue({
el: "#app",
data: {
isMorning: hours < 12,
isAfternoon: hours >= 12 && hours < 18,
isEvening: hours >= 18,
}
)}
</script>

v-else

if/else一样,v-if也可以与v-else配合使用。非此即彼

<div v-if="true">Day</div>
<div v-else>night</div>
`v-else`不能单独使用,必须与`v-if`配合使用。但`v-if`可以独立使用。

v-else-if

多重判断,可以使用v-else-if

<div id="example">
<p v-if="now === 'morning'">Good morning</p>
<p v-else-if="now === 'afternoon'">Good afternoon</p>
<p v-else-if="now === 'evening'">Good evening</p>
<p v-else>now is wrong</p>
</div>
<script>
new Vue({
el: "#app",
data: {
now: "morning" // afternoon or evening or other
}
)}
</script>

template

分组元素作为整块渲染,可以使用<template>作为虚拟的包裹元素,条件渲染分组,最终的渲染结果将不包含 <template> 元素

<template v-if="true">
<p>1</p>
<p>2</p>
<p>3</p>
</template>
<template v-else>
<p>一</p>
<p>二</p>
<p>三</p>
</template>
1
2
3

当然实际上,你也可以对分组元素包裹一个真正块状标签,如<div>标签,只是这样做会让页面多出一些无谓元素。

<div v-if="true">
<p>1</p>
<p>2</p>
<p>3</p>
</div>
<div v-else>
<p>一</p>
<p>二</p>
<p>三</p>
</div>

key 管理可复用的元素

Vue 框架的高效性体现在会尽可能复用已渲染的元素而不是从头开始渲染。这么做除了使 Vue 变得非常快之外,还有其它一些好处。

例如:模拟登录页面的输入框,允许用户选择不同的登录方式。那么在上面的代码中切换 loginType 将不会清除用户在切换前已经输入的内容。因为两个模板使用了相同的元素lableinput,如果用户没输入任何内容,也仅input框替换了它的 placeholder。

代码中出现事件绑定指定`v-on:click`和逻辑层的方法`methods`,此节可忽略,后面会讲解。

DEMO v-if中利用key来管理可复用的元素

<!-- 在input没有内容时点击按钮切换,和在input输入内容后再点击按钮切换,观察input的值变化 -->
<div id="app">
<!--不添加key的效果 -->
<template v-if="!key">
<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>
</template> <!--添加key的效果 -->
<template v-else>
<template v-if="loginType === 'username'" >
<label>Username</label>
<input placeholder="Enter your username" key="uername">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address" key="email">
</template>
</template>
<button v-on:click="handleToggle">点击切换</button>
<br/>
<br/>
<button v-on:click="changeKey">点击切换有KEY和无KEY的情形</button>
</div>
new Vue({
el: "#app",
data: {
loginType: "username",
key: false,
text: "点击看有KEY的情况" },
methods: {
handleToggle() {
if (this.loginType === "username") {
this.loginType = "email"
} else if (this.loginType === "email") {
this.loginType = "username"
}
},
changeKey() {
this.key = !this.key
}
}
})

v-show指令

v-show的写法与v-if完全一样,看下在这段代码,在页面最终显示结果完全一样,但审查元素elements中的元素结构是不一样。

    <div id="app">
<div v-if = "true"> day </div>
<div v-if = "false"> night </div>
<br/>
<div v-show = "true">day</div>
<div v-show = "false">night</div>
</div>

v-if`和v-show的区别

v-if指令为假值时,绑定的元素不会显示,Vue也不会生成对应的DOM元素,等到为真假时才创建并添加到DOM树中。
v-if指令每次显示都会创建元素并插入DOM树中,每次隐藏都会从DOM树中删除,绑定元素的显示和隐藏都需要更新DOM树。并且在v-if真假值的切换过程中,条件块内的事件监听器和子组件也会适当地被销毁和重建。所以v-if指令有很大的性能开销。

v-show绑定的元素只在初始阶段被创建,并保留在 DOM 中。元素的显示与隐藏只是添加或删除元素的 CSS 属性 display:none。
v-show 不支持 <template> 分组包裹元素,也不支持 v-else

所以如果某块内容需要频繁切换显示和隐藏,那最好用v-show指令绑定。

另外v-show也可能用于图片加载的优化。如果元素中包含图片,那么使用v-show绑定图片的父节点,一旦为真值时,图片会马上显示出来,因为在v-show为假值时图片已经被加载。如果是v-if指令,图片会等到v-if变为真值时才开始加载。

v-if=expression和v-show=expression值可以是表达式返回的truthy / falsy值

同{{}}插值中可以进行简单的表达式运算一样,v-ifv-show的值也可以是表达式,只要表达的结果是 truthy真值 或 falsy虚值 的值即可。

在 JavaScript 中,Truthy (真值)指的是在 布尔值 上下文中转换后的值为真的值。所有值都是真值

falsy(虚值)是在 Boolean 上下文中已认定可转换为‘假‘的值。即false,0,"",null,undefined 和 NaN。

传送门 MDN

<div id="app">
<p v-if="hours < 12">Good morning</p>
<p v-if="hours >= 12 && hours < 18">Good afternoon</p>
<p v-show="hours > 18">Good evening</p>
</div>
<div id="app">
<p v-if="obj.prop">如果属性值为truthy时显示,为falsy时不显示</p>
<p v-show="arr[1]">也可以是数组中的某项值为truthy时显示,为falsy时隐藏</p>
</div>

vue-learning:4-template-v-if-and-v-show的更多相关文章

  1. vue报错:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

    在.vue文件中引入了 element-ui 的 table 和 pagination 组件后,报错:Component template should contain exactly one roo ...

  2. 小白学习VUE第二课:环境搭建 VUE Node.js VSCode template模板

    环境搭建 VUE Node.js VSCode template模板: 首先安装node:http://www.runoob.com/nodejs/nodejs-install-setup.html ...

  3. Vue系列:如何将百度地图包装成Vue的组件

    主要分解为如下步骤: (1)在html文件中引入百度地图, <script type="text/javascript" src="http://api.map.b ...

  4. Vue.js:轻量高效的前端组件化方案

    转发一篇尤老师对vue.js的介绍,了解vue.js的来龙去脉.不过现在已经是2.0了,也有添加一些新的东西,当然有些东西也改了. Vue.js:轻量高效的前端组件化方案 Vue.js 是我在2014 ...

  5. Deep learning:四十九(RNN-RBM简单理解)

    前言: 本文主要是bengio的deep learning tutorial教程主页中最后一个sample:rnn-rbm in polyphonic music. 即用RNN-RBM来model复调 ...

  6. Deep learning:四十六(DropConnect简单理解)

    和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...

  7. Vue.js:轻量高效的前端组件化方案(转载)

    摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue ...

  8. 转载 Deep learning:六(regularized logistic回归练习)

    前言: 在上一讲Deep learning:五(regularized线性回归练习)中已经介绍了regularization项在线性回归问题中的应用,这节主要是练习regularization项在lo ...

  9. 组件嵌套时报:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

    在组件嵌套的过程中,报了一个错误: 这里报错的原因是:vue的组件(模板)只能有一个根节点,即.vue文件中的<template>标签下只能有一个子元素. 因此,建议大家在写.vue组件的 ...

  10. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十二║Vue实战:个人博客第一版(axios+router)

    前言 今天正式开始写代码了,之前铺垫了很多了,包括 6 篇基础文章,一篇正式环境搭建,就是为了今天做准备,想温习的小伙伴可以再看看<Vue 基础入门+详细的环境搭建>,内容很多,这里就暂时 ...

随机推荐

  1. [idea]idea配置tomcat 标签: tomcatidea 2017-03-12 22:12 402人阅读 评论(19)

    我们在使用idea的时候,一定会遇到的一步,就是使用tomcat来发布我们的项目,那么,如何在idea中设置tomcat呢?下面就随小编来一起学习一下吧. 设置tomcat 打开设置界面 Run-&g ...

  2. 洛谷P2051 中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  3. PLAY2.6-SCALA(五) Action的组合、范围的设置以及错误的处理

    一.自定义action 从一个日志装饰器的例子开始 1.在invokeBlock方法中实现 import play.api.mvc._ class LoggingAction @Inject() (p ...

  4. hdu5137 枚举删点

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ; ; ...

  5. Mybatis表关联多对多

    创建表 创建表对应的 JavaBean 对象 package com.tanlei.newer.model; import java.util.List; /** * @author:Mr.Tan * ...

  6. @codeforces - 793G@ Oleg and chess

    目录 @description - translation@ @solution@ @part - 1@ @part - 2@ @part - 3@ @part - 4@ @accepted code ...

  7. java 删除字符串左边空格和右边空格 trimLeft trimRight

    /** * 去右空格 * @param str * @return */ public String trimRight(String str) { if (str == null || str.eq ...

  8. vb.net机房收费系统——存储过程

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xdd19910505/article/details/35574125 一.使用背景         ...

  9. Open Source GIS and Freeware GIS Applications

    Open Source GIS and Freeware GIS Applications   An open source application by definition is software ...

  10. 独家 | TensorFlow 2.0将把Eager Execution变为默认执行模式,你该转向动态计算图了

    机器之心报道 作者:邱陆陆 8 月中旬,谷歌大脑成员 Martin Wicke 在一封公开邮件中宣布,新版本开源框架——TensorFlow 2.0 预览版将在年底之前正式发布.今日,在上海谷歌开发者 ...