09-不得不学的Vue.js基础之条件渲染

前端 · 2020-07-22 ·
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>条件渲染</title>
	<script src="https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js"></script>
</head>
<body>
	<div id="app">
		<!--1.v-if:该指令用于条件性地渲染一块内容,这块内容只会在指令的表达式返回truthy值的时候被渲染-->
		<h1 v-if="awesome">Vue is awesome!</h1>
		<!--也可用 v-else 添加一个“else块”:v-else 元素必须紧跟在带 v-if或者v-else-if后面,否则它将不被识别-->
		<h2 v-if="awesome2">Vue is awesome2!</h2>
		<h2 v-else>Oh no!</h2>
		<!--2.在 <template> 元素上使用 v-if 条件渲染分组-->
		<!--因为v-if是一个指令,所以必须将它添加到一个元素上。但是如果想切换多个元素呢?此时可以把一个<template>元素当做不见的包裹元素,并在上面使用v-if。最终渲染的结果将不包含<template>元素-->
		<template v-if="ok">
			<h1>Title</h1>
			<p>P1</p>
			<p>P2</p>
		</template>
		<!--3.v-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>
		<!--4.用 key 管理可复用的元素:
			Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做除了使Vue变得非常快之外,还有一些其它好处。例如,如果你允许用户在不同的登录方式之间切换:
		-->
		<div>
			<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>
			<button @click="toggleLoginType">Toggle login type</button>
		</div>
		<!--那么在上面的代码中切换loginType 将不会清楚用户已经输入的内容,因为两个模板使用了相同的元素,<input>不会被替换掉-仅仅是替换了它的placeholder。-->
		<!--这样就不总是符合实际需求,所以Vue为你提供了一种方式来表达“这两个元素是完全独立的,不要复用他们。”只需要添加一个具有唯一值的 key attribute 即可。-->
		<div>
			<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>
			<button @click="toggleLoginType">Toggle login type</button>
		</div>
		<!--5.v-show:另一个用于根据条件展示元素的选项是 v-show 指令-->
		<!--v-show的元素始终会被渲染并保留在DOM中,v-show只是简单地切换元素的display-->
		<!--v-show 不支持<template>元素,也不支持v-else-->
		<p>
			<h1 v-show="!ok">Hello!</h1>
			<h1 v-show="ok">Hello!</h1>
		</p>
		<!--6.v-if vs v-show-->
		<!--v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。-->
		<!--v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。-->
		<!--相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。-->
		<!--一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。-->
		<!--7.v-if 与 v-for 一起使用-->
		<!--不推荐同时使用v-if 和 v-for-->
		<!--当v-if 与 v-for 一起使用时,v-for具有比v-if更高的优先级。-->
	</div>
	<script>
		// 全局对象
		var vm = new Vue({
			el: "#app",
			data:{
				awesome:true,
				awesome2:false,
				ok:true,
				type:"B",
				loginType:"username"
			},
			methods:{
				toggleLoginType:function(){
					return this.loginType = this.loginType === 'username' ? 'email' : 'username'	
				}
			}
		});
	</script>
</body>
</html>

以下是测试数据:

Vue is awesome!

Vue is awesome2!

Oh no!

A
B
C
Not A/B/C

Hello!

Hello!

%