Vue事件
在Vue中事件处理是非常重要的一点,都只要Vue中的事件处理一般都放在methods属性中,其实这些事件也可以放在data中,但是这样就违背了Vue轻量的原则了
获取点击属性
<body>
<div id="app">
<button @click="getEven">获取点击事件</button>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false
var vm=new Vue({
el:'#app',
data:{},
methods:{
getEven(even){
console.log(even)
}
}
});
</script>
打印even
从这里可以看,在调用getEven事件的时候并没有传递传参,但even这个参数却存在,这个就是js底层的原理了,这个时候接收的就是鼠标点击的这个事件的参数了。
没有传递参数的时候,这第一个参数就是这个触发事件的系统参数,那么如果添加了参数以后,第一个还是么?这个有点Vue编程经验的的都知道,这种方式是无法获取到的,这种时候,就需要用到Vue事件中的关键字$event了
如下操作
<button @click="getEven2($event,5)">获取点击事件</button>
方法这样定义就可以看到下图的结果了,并且这个$event关键字的顺序并不是固定在第一个,可以随机放,只需要按照对应的顺序取出来就行了。
getEven2(e,res){
console.log("e",e)
console.log("res",res)
}
请输入图片描述
事件修饰符
常见的原生修饰符有preventDefault,默认事件的触发
<a href="https://ljy0427.online/TheRivers/" @click="goto">点我去江河三千里</a>
goto(){
alert("江河三千里")
}
例如这串代码,会在弹出提示框,点击确定之后,就会触发a标签的跳转事件,页面将会跳转到该网址,而这个跳转事件,就是默认事件,是a标签的默认跳转事件,所以如果想要阻止这种默认事件的触发就需要用到preventDefault了。
goto(e){
e.preventDefault()
alert("江河三千里")
}
这里这个参数e,就是通过$event关键是获取到的参数,也就是触发事件的参数了
在Vue中,已经封装好了各种事件修饰符了,只需要在html中调用函数的地方加上对应的关键字就可以了。
- prevent:阻止默认事件
- stop:阻止事件冒泡
- once:事件只触发一次
- capture:使用事件的捕获方式
- self:只有event.target是当前操作元素时才触发事件
- passive:事件的默认行为立即执行,无需等待事件回调执行完毕
使用如下,也即是在@click的后面加上.prevent
<a href="https://ljy0427.online/TheRivers/" @click.prevent="goto">点我去江河三千里</a>
解释这些事件,前三个不用解释了,都很常见,从第四个开始
capture:使用事件的捕获方式
js的事件处理顺序是从捕获到冒泡阶段,同时事件的处理通常都是在冒泡阶段;也即是,从外到里寻找事件的方法,然后从里到外的执行对应的事件
<div class="pre" @click="capture(1)"> div1 <div class="sub" @click="capture(2)"> div2 </div> </div> <style> .pre { width: 20vw; height: 15vh; background-color: skyblue; } .sub { width: 10vw; height: 10vh; background-color: beige; } </style>
所以在点击div2之后,会先输出2,再输出1,那么就会有需求了,我就要先输出1,再输出2。这个需要事件处理是在捕获阶段,而不是冒泡阶段了。
事件的冒泡
<div class="pre" @click.capture="capture(1)"> div1 <div class="sub" @click="capture(2)"> div2 </div> </div>
使用这个capture之后,就能将div1的事件处理阶段定义为捕获阶段
self:只有event.target是当前操作元素时才触发事件
代码上面类似
这种时候可以看到,当点击div2时,只输出2了,父元素的事件没有触发,self可以理解成自身,只有自身被调用的时候才触发
<div class="pre" @click.self="capture(1)">
div1
<div class="sub" @click="capture(2)">
div2
</div>
</div>
![只执行自己本身了][4]
passive:事件的默认行为立即执行,无需等待事件回调执行完毕
事件都存在这默认的行为,可以理解成Java中的构造函数一样,但二者的却别是,Java中的构造函数是在该方法被调用之后就会首先执行的,在js中这种默认行为,将会是在其他事件执行完毕之后才会执行。
就比如存在一个滚动框,如果在滚动条滚动时添加一些处理事件,这种时候,就会先执行该处理事件,执行完毕之后,才会发生滚动条的滚动
>直接上代码
```html
- 1
- 2
- 3
- 4
- 5
- 6