Vue.js系列(七): Vue的事件处理!

导读:本篇文章讲解 Vue.js系列(七): Vue的事件处理!,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Vue.js系列(七): Vue的事件处理!


前言


注意本次用cdn形式引入js学习,有node.js的玩家可以用node.js。CDN下载地址:https://vuejs.org/js/vue.min.js以及Node.js:Vue系列: windows下npm安装vue

今天博主将为大家分享Vue.js系列(七): Vue的事件处理!不喜勿喷,如有异议欢迎讨论!

有一个强大的地基才能写出健壮的程序!请先阅读博主关于:Windows10用npm安装Vue!,注意:下面的案例请自己手打一下运行效果查看
其他事件如:blur,change,focus,submit等等from事件都可以通过v-on指令绑定.!


目标

1. 学习vue中事件的绑定处理
2. 学习事件修饰符

1.1.1 v-on指令绑定

可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。

v-on等价于 @ + 事件名

例如: v-on:click=func 等价于 @click=func

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Vue 测试实例,Vue的事件!</title>
		<script src="js/Vue.min.js"></script>
	</head>
	<body>
		<div id="app">
		    <button type="button" v-on:click="n+=1">
		        点我
		    </button>
		    <p>
		        您共点击了<strong v-text="n"></strong>次按钮!
		    </p>
		</div>
		<script type="text/javascript">
		    var vm = new Vue({
		        el:"#app",
		        data:{
		            n:0
		        }
		    })
		</script>
	</body>
</html>

其他事件如:blur,change,focus,submit等等from事件都可以通过v-on指令绑定.


1.1.2 vm.$on绑定

vm.$on(event,callback)

参数
    event: {string | Array<string>} 事件名或包含事件名的数组
    callback: function 回调函数

通过vm.$on监听当前实例上的自定义事件。事件可以由vm.$emit触发。回调函数会接收所有传入事件触发函数的额外参数。 

1.1.3 vm.$off移除绑定

vm.$off(event,callback) 移除自定义事件监听器。

参数
    event: {string | Array<string>} 事件名或包含事件名的数组
    callback: function 回调函数

用法
    如果没有提供参数,则移除所有的事件监听器; 
    如果只提供了事件,则移除该事件所有的监听器; 
    如果同时提供了事件与回调,则只移除这个回调的监听器。 

1.1.4 vm.$emit触发事件

vm.$emit(event, […args])

触发当前实例上的事件。附加参数都会传给监听器回调。 

1.1.5 自定义事件监听示例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
		<title>事件处理</title>
	</head>
	<body>
		<div id="app">
			<h4>我的购物车<span v-text="a"></span></h4>
			<ul>
				<li v-for="c in carts" v-on:click="calc(c)">
					<span v-text="c.title"></span><strong v-text="c.price"></strong>
					<span v-if="c.count > 0">
						√ 已选择 <em v-text="c.count"></em> 件
					</span>
					<button v-on:click.stop="c.count > 0 && minus(c)">
						-
					</button>
				</li>
			</ul>
			<p v-text="`共计¥:${totalPrice}元`"></p>
		</div>
		<script src="../../vue.min.js"></script>
		<script type="text/javascript">
			var vm = new Vue({
				el: "#app",
				data: {
					a: "1",
					carts: [{
							title: "苹果",
							price: 2.5,
							count: 0
						},
						{
							title: "香蕉",
							price: 5.5,
							count: 0
						},
						{
							title: "西瓜",
							price: 10,
							count: 0
						},
					],
					sum: 0
				},
				created: function() {
					this.$on("summary", this.total);
				},
				computed: {
					totalPrice: function() {
						return this.sum.toFixed(2);
					}
				},
				watch: {
					'a': function(v) {
						return v + '元';
					}
				},
				methods: {
					minus: function(c) {
						console.log(c.count);
						c.count--;
						console.log(c.count);
						this.$emit("summary");
					},
					calc: function(c) {
						c.count++;
						this.$emit("summary");
					},
					total: function() {
						this.sum = 0;
						for (var i = 0; i < this.carts.length; i++) {
							console.log(this.carts[i].title, this.carts[i].price * this.carts[i].count)
							this.sum += this.carts[i].price * this.carts[i].count;
						}
					}
				}
			});
		</script>
	</body>
</html>

2.2 事件

通常情况下v-on会绑定一个函数去处理相关的业务.

通常事件会被绑定给一个函数

2.3 条件事件

条件事件是常用的一种应用场景.

即: 当表达式条件满足时,才触发相应的事件.

2.4 事件修饰符

.stop修饰符

阻止事件继续向上级传播.

.prevent修饰符

取消事件的默认动作。用于拥有默认动作的html标签 例如: <a>,<form>标签等.

.capture修饰符

使事件的触发顺序变为由外到内的顺序触发.

.self修饰符

只会触发元素本身的事件.事件不从内部的子孙元素触发.

即:event.target是当前元素本身时才会触发事件

.once修饰符

.once 修饰符 元素所绑定的事件仅触发1次

事件修饰符可以叠加使用

点击 button按钮中的 strong或strong内部的span标签时,不会触发button 的click事件.点击button按钮中除strong标签以外的区域时,才会触发click事件.


案例代码(从2.2开始到结束)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
		<title>事件处理</title>
	</head>
	<body>
		<div id="app">
			<button type="button" v-on:click="calc">
				点我++
			</button>
			<button type="button" v-on:click="n<5 && calc($event)">
				<span v-if="n<5">点我++</span>
				<span v-else>事件被移除</span>
			</button>
			<button type="button" v-on:click="n<5? calc():minus()">
				<span v-if="n<5">点我++</span>
				<span v-else>点我--</span>
			</button>
			<p>
				您共点击了<strong v-text="n"></strong>次按钮!
			</p>



			<div>
				<!-- form 表单的 submit 事件使用了 .prevent 修饰符,即代表在触发 submit 时,调用了 stopPropagation() 方法,阻止了submit的默认行为(post). -->
				<!-- 当form表单被提交时,会调用 save 事件,而不是form的默认行为. -->
				<form method="post" action="index.html" v-on:submit.prevent="save">
					<button type="submit">
						<!-- submit 按钮内的 span 的 click 事件使用 .prevent 即代表 span的click事件不会传播给button -->
						<span v-on:click.prevent="go">提交</span>表单
					</button>
					<button type="submit">测试2</button>
				</form>

				<form action="index.html" method="post" v-on:submit.prevent="save">
					<button type="submit" v-on:click="go2">
						<!-- .stop修饰符.阻止click事件传递给button,但仍会触发form的默认事件. -->
						<!-- 会调用 函数 go 和 save -->
						<span v-on:click.stop="go">.stop测试</span>
						<!-- 会调用 函数 go2 和 save -->
						<strong>按钮</strong>
					</button>
					<a href="http://www.baidu.com/" v-on:click.prevent="go">
						百度搜索
					</a>
				</form>

				<form method="post" action="index.html" v-on:submit.prevent="save">
					<!--这里的button按钮使用了 .self 修饰符.即代表 button 元素本身被点击时 才会触发 click 事件,并调用 save ,而 button 元素内部的子孙元素均不会触发 button 的click事件-->
					<button type="submit" v-on:click.self="go">
						<!-- 点击 子孙元素仅会触发 form 的submit 事件,不会触发 button 的事件 -->
						<strong>
							测试<span>aaas</span>
						</strong>
						<!-- 会触发函数 go2 和 save -->
						<span v-on:click="go2">提交</span>
						<!-- 鼠标点击 "表单" 时会触发 button 上的 go 函数和 form 的save 函数 -->
						表单
					</button>


					<!-- .once 修饰符 元素所绑定的事件仅触发1次 -->
					<!-- 首次点击时,会触发 go 和 save 函数,再次点击仅触发 save函数. -->
					<button type="submit" v-on:click.once="go">
						.once修饰符
					</button>
				</form>
				<!-- capture 即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理-->
				<div v-on:click.capture="doSome" style="border:solid 1px red;width:500px;display:block;">
					含.capture修饰符.
					<span v-on:click="go" style="margin:5px;display:block;border:dotted 1px blue;">内部事件go</span>
					<em>触发顺序:doSome->go</em>
				</div>

				<div v-on:click="doSome" style="border:solid 1px blue;width:500px;display:block;">
					不含.capture修饰符.
					<span v-on:click="go" style="margin:5px;display:block;border:dotted 1px blue;">内部事件go</span>
					<em>触发顺序:go->doSome</em>
				</div>

				<div v-on:click="doSome" style="border:solid 1px red;width:500px;display:block;">
					含.stop修饰符.
					<span v-on:click.stop="go" style="margin:5px;display:block;border:dotted 1px blue;">内部事件.stop</span>
				</div>

				<div v-on:click="doSome" style="border:solid 1px red;width:500px;display:block;">
					不含.stop修饰符.
					<span v-on:click="go" style="margin:5px;display:block;border:dotted 1px blue;">内部事件,向上传播</span>
				</div>
			</div>
		</div>
		<script src="../../vue.min.js"></script>
		<script type="text/javascript">
			var vm = new Vue({
				el: "#app",
				data: {
					n: 0
				},
				methods: {
					calc: function(e) {
						this.n += 1;
						console.log("event:", e); //JavaScript MouseEvent
						//console.log("element:", e.currentTarget) // <button type="button"> 点我 </button >
					},
					minus: function() {
						this.n -= 1;
					},
					go: function() {
						console.log("go", +new Date());
					},
					go2: function() {
						console.log("go2", +new Date());
					},
					save: function() {
						console.log("save", +new Date());
					},
					doSome: function() {
						console.log("doSome", +new Date());
					}
				}
			})
		</script>
	</body>
</html>

总结

在本次学习中需要:

1. 掌握vue中事件的绑定使用v-on指令和vm.$on绑定事件
2. 使用vm.$on绑定事件和vm.$emit触发事件
3. 掌握.stop,.prevent,.capture等事件修饰符的使用

勇于尝试(做下习题哦):第二天贴答案

  • 制作一个用户注册form表单并绑定表单的submit事件(仅校验有效性)完成注册业务

  • 表单中应至少包含用户名,密码,地区和注册


到这里Vue.js系列(七): Vue的事件处理!各位小伙伴快去试试吧!


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97749.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!