Vue:事件
Vue:事件
- 事件修饰符
- 键盘事件
事件是前端中非常重要的一个功能,Vue
自然也提供了对应的功能完成事件,通过v-on
指令,可以完成事件的绑定。
语法:
<标签 v-on:事件="回调函数(参数)">
示例:
<button v-on:click="func(111, 222)">按钮</button>
以上代码,完成了一个按钮的点击事件的监听,click
表示点击事件,回调函数为func
,传入的参数为111
和222
。
那么现在自然要去定义一个回调函数,回调函数定义在Vue
实例的methods
属性下:
new Vue({methods:{func(a, b){console.log(a)console.log(b) }}
})
点击按钮后,就会把111 222
分别传给a b
。
这里还有两个简写形式:
- 如果回调函数不需要传参,可以不加括号直接调用
v-on:
可以简写为@
<button @click="func">按钮</button>
这样就可以调用一个无参的func
回调函数。
原生的DOM
允许在回调函数中查看事件对象,Vue
的回调函数也能做到。
- 调用一个无参的回调函数时,会默认给第一个参数传入事件对象。
示例:
<div id="root"><button @click="func">按钮</button>
</div><script type="text/javascript">const vm = new Vue({el:'#root',methods:{func(e){console.log(e)}}})
</script>
在按钮中,调用func
时不传入任何参数,但是在回调函数中func
有一个参数e
。
输出这个参数e
:
这个参数就是事件对象。
如果在调用函数时,函数有参数,那么此时要通过$event
指定事件对象。
<button @click="func($event, 111, 222)">按钮</button>
以上事件绑定中,func
函数传入了三个参数,其中第一个$event
就表示这个参数传入事件对象。
func
函数如下:
func(e, a, b){console.log(e)console.log(a)console.log(b)
}
输出结果:
此时第一个参数e
接收到了事件对象,后了两个参数也正常传入了。
事件修饰符
事件修饰符是对一些常见的事件对象的操作做的封装,可以通过修饰符快速完成一部分功能。
语法:
<标签 v-on:事件.修饰符="回调函数(参数)">
修饰符以.
追加在事件后面。
先看一个示例:
<a href="http://www.baidu.com" @click="showInfo">点我提示信息</a>
这是一个<a>
标签,点击后触发showInfo
回调函数。但是<a>
标签是有默认行为的,也就是页面跳转,会跳转到百度。如果想要阻止这个行为,那么就需要阻止事件默认行为preventDefault
。
示例:
methods:{showInfo(e){e.preventDefault()}
}
但是在Vue
中,无需调用这个方法就可以实现阻止默认行为,只需加上prevent
修饰符即可:
<a href="http://www.baidu.com" @click.prevent="showInfo">点我提示信息</a>
这样就可以阻止默认行为,可以看出修饰符还是很方便的。
Vue
中的事件修饰符:
prevent
:阻止默认事件stop
:阻止事件冒泡once
:事件只触发一次capture
:在捕获阶段处理事件self
:只有event.target
是当前操作的元素时才触发事件passive
:事件的默认行为立即执行,无需等待事件回调执行完毕
简单说一下self
,这其实也是一种事件冒泡的的处理策略,当父元素收到来自子元素的事件冒泡,父元素就会触发相同的事件,但是此时可以通过检测事件对象event.target
来判断是不是自己,从而决定是否要执行回调。
self
简化了这个过程,只需要加入这个事件修饰符,那么收到来自子元素的冒泡,就不会触发事件。
键盘事件
在键盘触发的事件例如keyup
、keydown
中,需要通过event.keyCode
来对比判断用户按下了哪个键,这其实挺麻烦的,Vue
简化了这个语法。
语法:
<标签 v-on:事件.键位="回调函数(参数)">
在事件后,可以通过直接.键位
的形式,来判断用户按下了哪个键,只有按下了指定的键位才会去触发回调函数,不需要再在回调函数内部判断了。
示例:
<input type="text" @keydown.enter="func">
以上输入框,绑定了一个keydown
事件,只有用户按下enter
键时才会触发回调函数func
。
常见的键位如下:
值 | 键位 | 备注 |
---|---|---|
enter | 回车 | |
delete | 删除 | 同时捕获“删除”和“退格”键 |
esc | 退出 | |
space | 空格 | |
tab | 换行 | 必须配合keydown 去使用 |
up | 上 | |
down | 下 | |
left | 左 | |
right | 右 |
除去以上提到的,Vue
也可以通过事件.键位
来指定。
其实键盘上的每个键位都有自己的名字,这可以通过event.key
查询。
为一个输入框绑定一个事件,在事件内部输出event.key
和event.KeyCcode
:
console.log(e.key,e.keyCode)
按下几个按钮:
可以看到,每个键位都有名称,这些名称可以直接填入事件.键位
中。
比如:
<input type="text" @keydown.Enter="func">
<input type="text" @keydown.Shitf="func">
<input type="text" @keydown.Control="func">
<input type="text" @keydown.Tab="func">
之前的enter
、delete
、esc
等名称,都是对键原本名称的缩写或简写,并且全部转为了小写字母,方面代码快速编写。
但是有一个不一样,就是CapsLock
,它是由两个单词组成的大驼峰命名,这种多个单词的键位,需要全部改成小写字母,并且用-
连接多个单词:
<input type="text" @keydown.caps-lock="func">
除此之外,还可以直接用事件.KeyCode
来绑定事件,比如:
<input type="text" @keydown.13="func">
<input type="text" @keydown.16="func">
<input type="text" @keydown.17="func">
<input type="text" @keydown.9="func">
这和之前那四个是同样的效果,但是这个特性已经不推荐了,未来有可能会被移除。
现在就有一个问题了,事件.修饰符
与事件.键位
,他们的位置重复了,如果都需要使用,应该怎么写?
这个很好解决,直接连着写就行:事件.修饰符.键位
或者事件.键位.修饰符
例如:
按下Tab
键的同时,阻止默认行为:
<input type="text" @keydown.tab.prevent="func">
也可以写为:
<input type="text" @keydown.prevent.tab="func">
他们两者也有略微的差别,.tab.prevent
语法中,先检测是否是tab
键,再阻止默认行为。而.prevent.tab
中,先阻止默认行为,再检测是否是tab
键。
除此之外,修饰符和修饰符之间也可以一起使用:
<input type="text" @keydown.prevent.stop="func">
以上事件绑定中,同时使用了prevent
阻止默认行为和stop
阻止冒泡,此时两者都会生效。同理,先阻止默认行为,后阻止冒泡。