4、v-cloak指令、v-text、v-html、v-once、v-pre、切换图片案例、v-model

v-cloak

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			[v-cloak] {
				/* 属性选择器 */
				display: none;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<!-- 在Vue解析HTML之前,h2标签存在一个v-cloak属性(不要显示{{msg}}) -->
			<h2 v-cloak>{{msg}}</h2>
			<!-- 在Vue解析HTML之后({{msg}}被替换),h2标签不存在这个v-cloak属性 -->
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			setTimeout(function(){
				const app = new Vue({
					el:'#app',
					data:{
						msg:'Hello v-cloak'
					}
				})
			}, 3000)
		</script>
	</body>
</html>

插值表达式存在的问题:闪动。

解决:使用v-cloak配合插值表达式使用。

先隐藏起来,等到Vue解析过后,再显示出来。

v-text和v-html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<p>
				插值表达式: <span>{{msg}}</span>
			</p>
			<p>
				v-text: <span v-text="msg"></span>
			</p>
			<p>
				v-html: <span v-html="msg"></span>
			</p>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			new Vue({
				el:'#app',
				data:{
					msg:'<span style="font-size:30px;color:red">Hello Vue数据填充指令</span>'
				}
			})
		</script>
	</body>
</html>

在这里插入图片描述

v-pre和v-once

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			v-pre: <span v-pre>{{msg}}</span>
			<!-- v-pre用于跳过该元素及其子元素的编译过程,按照原始方式展示出来 --><br>
			v-once: <span v-once>{{msg}}</span>
			<!-- v-once一次性插值,当数据改变时,插值处不会更新 -->
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			new Vue({
				el:'#app',
				data:{
					msg:'Hello Vue.js'
				}
			})
		</script>
	</body>
</html>

在这里插入图片描述

v-for、v-bind结合

案例:点击哪个元素,哪个元素显示红色。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			.active {
				/* class选择器 */
				color: red;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<ul>
				<!-- 动态绑定class属性:v-bind -->
				<li v-for="(item,index) in movies" v-bind:class="{active:currentIndex === index}" @click="clickItem(index)">{{item}}</li>
			</ul>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			new Vue({
				el:'#app',
				data:{
					currentIndex:0,
					movies:['肖申克的救赎','釜山行','小丑','飓风营救']
				},
				methods:{
					clickItem(index) {
						this.currentIndex = index;
					}
				}
			})
		</script>
	</body>
</html>

在这里插入图片描述

v-on、v-bind、watch的结合

点击上一张、下一张的按钮来切换图片,如果是第一张,默认不能点击上一张,如果是最后一张,默认不能点击下一张。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<button v-on:click="pre" v-bind:disabled="first">前一张</button>
			<button v-on:click="next" v-bind:disabled="second">后一张</button>
			<br>
			<!-- 事件绑定的语法糖:@ -->
			<img v-bind:src="imgsrc[num]" width="300px" height="500px">
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			const app = new Vue({
				el:'#app',
				data:{
					num:0,
					first:true,
					second:false,
					imgsrc:[
						'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1596101911597&di=a3e63fab05228a8b63d5bbb94d593ea6&imgtype=0&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2Fe7bf0717d2b00cf48ebb9c0de83514f96485cf8929b1e-s1Odrq_fw658',
						'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1596101965505&di=da0c7be2e79cdc6dddbc2d5c1cc6200b&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201705%2F30%2F20170530215558_fTxdi.thumb.700_0.jpeg',
						'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1709263902,249359209&fm=11&gp=0.jpg'
					]
				},
				methods:{
					/* ES6方法的写法 */
					pre() {
						if (this.num > 0 && this.num < this.imgsrc.length) {
							this.num--;
						}
					},
					next() {
						if (this.num >= 0 && this.num < this.imgsrc.length - 1) {
							this.num++;
						}
					}
				},
				watch:{
					num:function(newValue, oldValue) {
						if (newValue===0) {
							this.first = true;
						} else {
							this.first = false;
						}
						if (newValue===this.imgsrc.length - 1) {
							this.second = true;
						} else {
							this.second = false;
						}
					}
				}
			})
		</script>
	</body>
</html>

v-model原理

利用了v-bind:value和v-on:input事件。

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>v-model</title>
	</head>
	<body>
		<div id="app">
			<label for="name"></label>
			<!-- v-bind:value:单向绑定,v-on:input: 监听输入事件 -->
			<!--<input type="text" id="name" placeholder="edit me" v-bind:value="message" v-on:input="valueChange">-->
			<input type="text" id="name" placeholder="edit me" v-bind:value="message" v-on:input="message = $event.target.value">
			message is : {{message}}
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			const app = new Vue({
				el: '#app',
				data: {
					message: 'Hello Vue',
				},
				methods: {
					valueChange(event) {
						this.message = event.target.value;
					}
				}
			});
		</script>
	</body>
</html>

v-model结合radio

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<label for="male"></label>
			<input type="radio" id="male" v-model="gender" value="">
			<label for="female"></label>
			<input type="radio" id="female" v-model="gender" value="">
			<hr >
			<span>你选择了{{gender}}</span>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			new Vue({
				el:'#app',
				data:{
					gender:''
				}
			})
		</script>
	</body>
</html>

v-model结合checkbox

  • 单选框:boolean
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<label for="agree">I accept.</label>
			<input type="checkbox" id="agree" v-model="checked"><br>
			<button :disabled="!checked">下一步</button>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			new Vue({
				el:'#app',
				data:{
					checked:false
				}
			})
		</script>
	</body>
</html>
  • 多选框:数组
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<input type="checkbox" value="music" v-model="hobbies">音乐
			<input type="checkbox" value="trip" v-model="hobbies">旅行
			<input type="checkbox" value="food" v-model="hobbies">美食
			<input type="checkbox" value="sleep" v-model="hobbies">睡觉
			<span>您的爱好有:{{hobbies}}</span>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			new Vue({
				el:'#app',
				data:{
					hobbies:[]
				}
			})
		</script>
	</body>
</html>

v-model结合select

  • 单选:一个值,(省市区)
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<select v-model="selected">
				<option disabled>请选择</option>
				<option value="Beijing">北京</option>
				<option value="Shanghai">上海</option>
				<option value="Shenzhen">深圳</option>
			</select>
			<span>你选择的是:{{selected}}</span>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			new Vue({
				el:'#app',
				data:{
					selected:''
				}
			})
		</script>
	</body>
</html>
  • 多选:数组
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<!-- 在选择时需要按ctrl键 -->
			<select v-model="selected" multiple>
				<option value="Hangzhou">杭州</option>
				<option value="Nanjing">南京</option>
				<option value="Chengdu">成都</option>
				<option value="Chongqing">重庆</option>
			</select>
			<span>你选择了:{{selected}}</span>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			new Vue({
				el:'#app',
				data:{
					selected:[]
				}
			})
		</script>
	</body>
</html>

v-model修饰符

lazy修饰符

  • 默认情况下,v-model默认是在input事件中同步输入框的数据
  • 就是说,一旦有数据发生改变对应的data中的数据就会自动发生改变
  • lazy修饰符可以让数据在失去焦点或者回车时才会更新(不会实时更新)

number修饰符

  • 默认情况下,在输入框中无论输入数字还是字母,v-model都会把他们当做字符串类型来处理
    在这里插入图片描述

  • number修饰符可以让在输入框中输入的内容自动转化成数字类型
    在这里插入图片描述

trim修饰符

  • 如果输入的内容首尾有很多空格(在页面中是看不到的,但在控制台可以看到)
    在这里插入图片描述

  • 使用trim修饰符可以过滤内容左右两边的空格

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			用户名:<input type="text" v-model.lazy="username"><br>
			年龄:<input type="text" v-model.number="age"><br>
			自我介绍:<textarea rows="3" cols="20" v-model.trim="about">
				
			</textarea>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			new Vue({
				el:'#app',
				data:{
					username:'',
					age:0,
					about:''
				}
			})
		</script>
	</body>
</html>

猜你喜欢

转载自blog.csdn.net/ShawnYue_08/article/details/107858291