vue快速入门2

183 阅读10分钟

条件渲染v-if、v-else-if、v-else

根据表达式的值的真假条件渲染元素。在切换时元素及它的数据绑定 / 组件被销毁并重建。 示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<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>

		</div>
	</body>
	<script>
		var app = new Vue({
			el: '#app',
			data: {
				type:'A'
			}
		})
	</script>
</html>

运行结果

vue用key管理可复用的元素

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<template v-if="loginType === 'username'">
				<label>Username</label>
				<input placeholder="Enter your username" key="input">
			</template>
			<template v-else>
				<label>Email</label>
				<input placeholder="Enter your email address" key="input">
			</template>
			<button v-on:click="toggleLoginType()">Toggle login type</button>
		</div>

	</body>
	<script>
		var app = new Vue({
			el: '#app',
			data: {
				loginType: 'username'
			},
				methods: {
					toggleLoginType: function() {
						return this.loginType = this.loginType === 'username' ? 'email' : 'username'
					}
				}

		})
	</script>
</html>

运行结果

条件渲染v-show

根据表达式之真假值,切换元素的 display CSS 属性。意思是该元素还在,只是不可见(display: none;)

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

	</head>
	<body>
		<div id="app">
			<h1 v-show="ok">Hello!</h1>
			<h1 v-show="ok===false">false!</h1>
		</div>

	</body>
	<script>
		var app = new Vue({
			el: '#app',
			data: {
				ok: true
			}
		})
	</script>
</html>

运行结果

列表渲染v-for

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<!-- 用 v-for 把一个数组对应为一组元素 -->
		<ul id="example-1">
			<li v-for="item in items" :key="item.id">
				{{ item.message }}
			</li>
		</ul>
		<hr >
		<!-- 在 v-for 块中,我们可以访问所有父作用域的属性。v-for 还支持一个可选的第二个参数,即当前项的索引。 -->
		<ul id="example-2">
			<li v-for="(item, index) in items">
				{{ parentMessage }} - {{ index }} - {{ item.message }}
			</li>
		</ul>
		<hr >
		<!-- 你也可以用 v-for 来遍历一个对象的属性。 -->
		<ul id="v-for-object">
			<li v-for="value in object">
				{{ value }}
			</li>
			<hr >
			<!-- 你也可以提供第二个的参数为 property 名称 (也就是键名) -->
			<div v-for="(value, name) in object">
				{{ name }}: {{ value }}
			</div>
			<hr >
			<!-- 还可以用第三个参数作为索引 -->
			<div v-for="(value, name, index) in object">
				{{ index }}. {{ name }}: {{ value }}
			</div>
		</ul>

	</body>
	<script>
		var example1 = new Vue({
			el: '#example-1',
			data: {
				items: [{
						message: 'Foo'
					},
					{
						message: 'Bar'
					}
				]
			}
		})
		var example2 = new Vue({
			el: '#example-2',
			data: {
				parentMessage: 'Parent',
				items: [{
						message: 'Foo'
					},
					{
						message: 'Bar'
					}
				]
			}
		})
		new Vue({
			el: '#v-for-object',
			data: {
				object: {
					title: 'How to do lists in Vue',
					author: 'Jane Doe',
					publishedAt: '2016-04-10'
				}
			}
		})
	</script>
</html>

运行结果

v-for 默认行为试着不改变整体,而是替换元素。迫使其重新排序的元素,你需要提供一个 key 的特殊属性:

<div v-for="item in items" :key="item.id">
  {{ item.text }}
</div>

v-for里使用值范围

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<span v-for="n in 10">{{ n }} </span>
		</div>

	</body>
	<script>
		var app = new Vue({
			el: '#app',
			data: {
			}	
		})
	</script>
</html>

运行结果

v-for和v-if结合使用

当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。当你只想为部分项渲染节点时,这种优先级的机制会十分有用,如下:

<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo }}
</li>

上面的代码将只渲染未完成的 todo。

而如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或 <template>)上。如:

<ul v-if="todos.length">
  <li v-for="todo in todos">
    {{ todo }}
  </li>
</ul>
<p v-else>No todos left!</p>

完整示例代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<li v-for="todo in todos" v-if="todo!==2">{{ todo }}</li>
		</div>

	</body>
	<script>
		var app = new Vue({
			el: '#app',
			data: {
				todos: [1, 2, 3]
			}
		})
	</script>
</html>

运行结果

计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

所以,对于任何复杂逻辑,你都应当使用计算属性。

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="vm">
			<li v-for="n in evenNumbers">{{ n }}</li>
		</div>
		<div id="app">
			<li v-for="n in even(numbers)">{{ n }}</li>
		</div>
		
	</body>
	<script>
		var vm = new Vue({
			el: '#vm',
			data: {
				numbers: [1, 2, 3, 4, 5]
			},
			computed: {
				evenNumbers: function() {
					return this.numbers.filter(function(number) {
						return number % 2 === 0
					})
				}
			}
		})
		var app = new Vue({
			el: '#app',
			data: {
				numbers: [1, 2, 3, 4, 5]
			},
			methods: {
				even: function(numbers) {
					return numbers.filter(function(number) {
						return number % 2 !== 0
					})
				}
			}
		})
	</script>
</html>

我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。

v-on

绑定事件监听器。 示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="example-1">
			<button v-on:click="counter += 1">Add 1</button>
			<p> {{ counter }} </p>
		</div>

	</body>
	<script>
		var example1 = new Vue({
			el: '#example-1',
			data: {
				counter: 0
			}
		})
	</script>
</html>

运行结果

v-model

在表单控件或者组件上创建双向绑定。

双向绑定文本输入框

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="example">
			<label>文本</label>
			<br>
			<input v-model="message" placeholder="edit me">
			<p>Message is: {{ message }}</p>
			
			<label>多行文本</label>
			<br>
			<span>Multiline message is:</span>
			<p style="white-space: pre-line;">{{ msg }}</p>
			<br>
			<textarea v-model="msg" placeholder="add multiple lines"></textarea>

		</div>
	</body>
	<script>
		var vm=new Vue({
			el: '#example',
			data:{
				message:'',
				msg:''
			}
		})
	</script>
</html>

运行结果

双向绑定单选框和复选框

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="example">
			单个复选框,绑定到布尔值:
			<br>
			<input type="checkbox" id="checkbox" v-model="checked">
			<label for="checkbox">{{ checked }}</label>
			<br>
			多个复选框,绑定到同一个数组:
			<br>
			<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
			<label for="jack">Jack</label>
			<input type="checkbox" id="john" value="John" v-model="checkedNames">
			<label for="john">John</label>
			<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
			<label for="mike">Mike</label>
			<br>
			<span>Checked names: {{ checkedNames }}</span>
		</div>
	</body>
	<script>
		var vm = new Vue({
			el: '#example',
			data: {
				checked: '',
				checkedNames: []
			}
		})
	</script>
</html>

运行结果

绑定单选按钮

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="example">
			<input type="radio" id="one" value="One" v-model="picked">
			<label for="one">One</label>
			<br>
			<input type="radio" id="two" value="Two" v-model="picked">
			<label for="two">Two</label>
			<br>
			<span>Picked: {{ picked }}</span>
		</div>
	</body>
	<script>
		new Vue({
			el: '#example',
			data: {
				picked: ''
			}
		})
	</script>
</html>

运行结果

绑定选择框单选

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="example">
			<select v-model="selected">
				<option disabled value="">请选择</option>
				<option>A</option>
				<option>B</option>
				<option>C</option>
			</select>
			<span>Selected: {{ selected }}</span>
		</div>
	</body>
	<script>
		new Vue({
			el: '#example',
			data: {
				selected: ''
			}
		})
	</script>
</html>

运行结果

绑定选择框多选

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="example">
			<select v-model="selected" multiple style="width: 50px;">
				<option>A</option>
				<option>B</option>
				<option>C</option>
			</select>
			<br>
			<span>Selected: {{ selected }}</span>
		</div>
	</body>
	<script>
		new Vue({
			el: '#example',
			data: {
				selected: []
			}
		})
	</script>
</html>

运行结果

选择框用v-for渲染的动态选项

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="example">
			<select v-model="selected">
				<option v-for="option in options" v-bind:value="option.value">
					{{ option.text }}
				</option>
			</select>
			<span>Selected: {{ selected }}</span>
		</div>
	</body>
	<script>
		new Vue({
			el: '#example',
			data: {
				selected: 'A',
				options: [{
						text: 'One',
						value: 'A'
					},
					{
						text: 'Two',
						value: 'B'
					},
					{
						text: 'Three',
						value: 'C'
					}
				]
			}
		})
	</script>
</html>

运行结果

v-model修饰符

示例代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="example">
			<!-- 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步: -->
			在默认情况下
			<input v-model="msg">
			{{msg}}
			<br>.lazy
			<!-- 在“change”时而非“input”时更新 -->
			<input v-model.lazy="msg2">
			{{msg2}}
			<br>指定输入类型为number
			<!-- 如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符: -->
			<!-- 键盘除了数字键其它键是不起作用的 -->
			<input v-model="age" type="number">
			<br>.number
			<input v-model.number="age2" type="number">
			<br>.trim
			<!-- 如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符: -->
			<input v-model.trim="msg3">


		</div>
	</body>
	<script>
		var vm = new Vue({
			el: '#example',
			data: {
				msg: '',
				age:'',
				age2:'',
				msg2:'',
				msg3:''
			}
		})
	</script>
</html>

运行结果

官方文档

码云代码

github代码

个人网站:www.panbingwen.cn