学习Vue的第四天

事件处理

事件修饰符

事件有很多种,主要分为鼠标事件和键盘事件,
这两类典型的JavaScript如下:

  • 鼠标事件:click单击 dblclick双击 mouseover鼠标经过 mouseout鼠标离开等等
  • 键盘事件:keydown键盘按下 keyup键盘抬起等

事件修饰符:主要指我们在Vue事件处理过程中,可以使用它来实现阻止默认行为,阻止事件冒泡或者获取键盘修饰符等基本功能。

使用方式很简单,在v-on指令后使用点号连接事件修饰符即可

鼠标事件修饰符:

  • stop 阻止事件冒泡
  • prevent 阻止事件默认行为
  • capture 捕获内部元素
  • once 只执行一次

键盘事件修饰符:是keyCode值的别名,指定按键触发事件

  • enter
  • tab
  • delete (捕获“删除”和“退格”键)
  • esc
  • space
  • up
  • down
  • left
  • right
	<body>
		<div id="app">
			<h4>键盘事件</h4>
			<input type="text" @keyup="keyupevent" @keydown="keydownevent">
			<p @mousemove="mousemoveevent">我是监听鼠标事件</p>
			<a href="www.baidu.com" @click.prevent="aclick">百度</a>
		</div>
	</body>
	<script src="js/vue.js"></script>
	<script>
		var vm = new Vue({
			el: '#app',
			methods: {
				keyupevent() {
					console.log("键盘弹起事件监听");
				},
				keydownevent() {
					console.log("键盘按下事件监听");
				},
				mousemoveevent() {
					console.log("鼠标移动监听事件");
				},
				aclick() {
					console.log("超链接被点击了");
				}
			}
		});
	</script>

页面显示:
在这里插入图片描述

事件对象

在事件处理过程中会用到事件对象,即在事件处理过程中会自动触发一个event事件对象,我们可以从中获取一些内容或做某些事情。

  • event.type 事件类型
  • event.target 触发事件的HTML元素
  • event.currentTarget 事件绑定的元素
  • event.preventDefault 阻止事件默认行为
  • event.stoppropagation 阻止事件冒泡

在Vue中使用是事件对象分两步:

  1. 传递事件对象
    当v-on绑定处理函数时,手动传递事件对象$event,当传递多个参数时,$evnet永远在最后,代表当前对象
  2. 接收事件对象
    在methods方法中定义函数位置,通过形参接收事件对象
	<body>
		<div id="app">
			<table>
				<tr>
					<td>序号</td>
					<td>名称</td>
					<td>价格</td>
					<td>操作</td>
				</tr>
				<tr v-for="(good,index) in goodsList">
					<td>{{index+1}}</td>
					<td>{{good.name}}</td>
					<td>{{good.price}}</td>
					<td><a href="#" @click.prevent="editItem($event)">编辑</a></td>
				</tr>
			</table>
		</div>
	</body>
	<script src="js/vue.js"></script>
	<script>
		var vm = new Vue({
			el: '#app',
			data: {
				goodsList: [
					{name:'iphone',price:'8888'},
					{name:'vivo',price:'4689'},
					{name:'oppo',price:'5999'}
				]
			},
			methods: {
				editItem(event) {
					console.log(event);
					console.log(event.target);
					console.log(event.type);
				}
			}
		});
		/* 
			上面的例子中,存在的最大问题就是大量的HTML元素绑定事件处理函数
			每一个超链接都绑定了一个点击事件,影响程序的执行能力,对移动端性能更差。
			如何解决该问题?
		 */
	</script>

页面显示:
在这里插入图片描述
点击编辑超链接后,控制台输出:
在这里插入图片描述

事件委派

借助事件对象实现一个事件委托机制,从而提供程序的性能。

什么是事件委派机制?

事件委派在列表渲染过程中,大部分在v-for指令中,借助event事件对象,在父级元素中绑定事件处理函数,而不是在子元素上绑定事件处理函数。
通过使用事件委派,就可以解决上个例子中的问题。

	<body>
		<div id="app">
			<table @click="editItem($event)">
				<tr>
					<td>序号</td>
					<td>名称</td>
					<td>价格</td>
					<td>操作</td>
				</tr>
				<tr v-for="(good,index) in goodsList">
					<td>{{index+1}}</td>
					<td>{{good.name}}</td>
					<td>{{good.price}}</td>
					<td><a href="#" v-bind:data-index="index">编辑</a></td>
				</tr>
			</table>
		</div>
	</body>
	<script src="js/vue.js"></script>
	<script>
		var vm = new Vue({
			el: '#app',
			data: {
				goodsList: [
					{name:'iphone',price:'8888'},
					{name:'vivo',price:'4689'},
					{name:'oppo',price:'5999'}
				]
			},
			methods: {
				editItem(event) {
					// 如果单纯这样去做,会发现点击表格任意位置都会触发(如何解决)
					console.log("点击");
					// console.log(event);
					
					console.log(event.target.nodeName.toLowerCase());
					console.log(typeof event.target.nodeName.toLowerCase());
					// 如果只是想点击a标签时触发该函数,操作如下:
					if (event.target.nodeName.toLowerCase() == 'a') {
						console.log('点击了a标签');
						console.log("dataset-index=" + event.target.dataset.index);
					}
				}
			}
		});
	</script>

表单处理

双向数据绑定指令(v-model)

表单处理主要分为两部分内容:

  1. 表单输入绑定,表单输入数据如何与Vue框架中的data数据双向绑定
  2. 内容是表单事件处理

在Vue中实现表单双向绑定,直接使用v-model指令进行关联即可;v-model会根据控件类型自动选取正确的方法来更新元素。

	<body>
		<div id="app">
			<div>请输入name值:</div>
			<!-- v-model="name" ==> v-model:value="name" -->
			<input type="text" v-model="name" placeholder="请输入...">
			<hr>
			<div>name={{name}}</div>
			<div>
				性别:
				<input v-model="gender" type="radio" name="gender" value="male"><input v-model="gender" type="radio" name="gender" value="female"><hr>
				你选择的性别:{{gender}}
			</div>
			<div>
				选择省份:
				<select name="" v-model="province">
					<option value="辽宁省">辽宁省</option>
					<option value="湖南省">湖南省</option>
					<option value="广东省">广东省</option>
					<option value="四川省">四川省</option>
				</select>
				<hr>
				你选择的省份是:{{province}}
			</div>
		</div>
	</body>
	<script src="js/vue.js"></script>
	<script>
		var vm = new Vue({
			el: '#app',
			data: {
				name: '',
				gender: 'male',
				province: ''
			}
		});
	</script>

页面显示:
在这里插入图片描述
在视图中改变数据:
在这里插入图片描述

表单事件

表单事件处理,就是表单元素发生变化时会触发响应事件,可以为表单元素绑定事件处理函数。表单事件处理函数如下:

事件触发控件说明
focustext文本框文本框获取光标焦点
blurtext文本框文本框失去光标焦点
click单选按钮、复选框选中某一个额单选按钮或复选框
change下拉列表/text文本框切换下拉列表选项/当文本框失去焦点时,内容发生改变时触发
submit提交按钮单击提交按钮()
	<body>
		<div id="app">
			<div>
				请输入name值:
				<input type="text" v-model="name" @change="handleChange" 
				@focus="handleFocus" @blur="handleBlur" />
			</div>
		</div>
	</body>
	<script src="js/vue.js"></script>
	<script>
		var vm = new Vue({
			el: '#app',
			data: {
				name: ''
			},
			methods: {
				handleBlur() {
					console.log("文本框失去焦点时触发");
				},
				handleFocus() {
					console.log("文本框获取焦点时触发");
				},
				handleChange() {
					console.log("文本框内容改变");
				}
			}
		});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值