vue学习记录-05 事件监听

vue学习记录-05 事件监听

这篇文章是根据codewhy老师在b站的视频进行的学习记录



一、v-on的基本使用

v-on用于绑定事件监听器,最常见的就是click点击事件,其他也有鼠标移入移出、键盘按下松开等。一般也可以写为“@”便于使用。
下面是一个简单的步进器小案例。

<div id='app'>
    <h2>{{counter}}</h2>
    <button v-on:click="increment">+</button>
    <button @click="decrement">-</button>
</div>
const app = new Vue({
      el: '#app',
      data: {
        counter: 0
      },
      methods:{
        increment(){
          this.counter++
        },
        decrement(){
          this.counter--
        }
      }
    })

二、v-on的参数问题

关于v-on的参数问题,我们分为三种情况来讲:

1、方法不需要参数的情况

如果在事件监听时,方法不需要额外参数,那么方法后面的小括号可以省略

   <button @click='btnClick()'>1</button>
   <button @click='btnClick'>1</button>
btnClick(){
          console.log('btnClick');
        },

2、 方法需要参数没传的情况

在事件定义时,写函数时省略了小括号,但是方法本身又是需要一个参数的,那么VUE会怎么传值呢?

正常传值的写法:

<button @click='btn2Click(123)'>2</button>
btn2Click(a){
          console.log('btn2Click',a);
        },

省略了小括号,所以没有传值的情况:

<button @click='btn2Click'>2</button>

这个时候,Vue会默认将浏览器生产的event事件对象作为参数传入到方法

引申:如果没有省略小括号,但是没有传值呢?

<button @click='btn2Click()'>2</button>

此时打印结果会显示undefined

3、方法需要参数和event对象的情况

方法定义时,我们需要event对象,同时又需要其他参数,这种情况我们需要怎么做呢?

按照情况2我们可以直接省略小括号,这样就可以拿到值了。

<button @click='btn3Click'>3</button>
btn3Click(event,a){
          console.log(event,a);
        }

但是,这个时候参数a又该怎么传值呢?或者把a和event对调一下,参数event还能正确的拿到event对象吗?

  btn3Click(a,event){
    console.log(a,event);
  }

这种情况下,拿到event对象的是参数a,参数event显示为undefined

其实很简单,我们直接把a的值和event对象与方法中参数的位置相互对应的写就完事了。

<button @click='btn3Click(123,event)'>3</button>

当然,上面这个写法也是错的,因为这样传过去的只是一个event字符串而已。
想要将event对象传过去,就得加个$符号,告诉浏览器这是event对象不是字符串才行。

<button @click='btn3Click(123,$event)'>3</button>

v-on

在调用方法时,手动的获取到浏览器参数的event对象:$event

三、v-on的修饰符

1、.stop修饰符

现在我们有这样的一行代码,点击button按钮后,你觉得会发生什么呢?

    <div @click="divClick">
      <button @click="btnClick">按钮</button>
    </div>
        btnClick(){
          console.log('btnClick');
        },
        divClick(){
          console.log('divClick');
        },

v-on
它会把div的点击事件也给执行一遍!而我们仅仅只是点击了button而已!
这种情况是可以避免的,给button按钮的@click加个.stop修饰符,就可以告诉浏览器:停!到此为止,不要再深究了!

    <div @click="divClick">
      <button @click="btnClick.stop">按钮</button>
    </div>

v-on

2、.prevent修饰符

有的时候,我们不希望某些元素执行他们默认的事件,这个时候我们可以给它加个.prevent修饰符。
比如表单的submit按钮,我们不希望点击后直接提交上去了,而是希望对数据做些修改再提交,就可以这么做。

    <form action="baidu">
      <input type="submit" value="提交" @click.prevent="submitClick">
    </form>
        submitClick(){
          console.log('submitClick');
          // 这里给它做一些数据处理之类的总之没那么快提交上去
        },

3、监听键盘的某个按键

在监听键盘时,一个键盘上有那么多个键,如果不加个修饰符给它限定一下是哪个键,那么对这个监听事件进行绑定实际上也没有什么太大的用处。

input type="text" @keyup="keyUp">
 keyUp(){
   console.log('keyUp');
 },

因为如果每个键都能触发绑定的方法,就起不到使用特定的按键进行控制的效果了,想想打拳皇如果随便搓几下就放出了大招,这样玩会有啥意思呢?

对按键进行绑定,最常用的就是回车键了,这里就以回车键来举个例子:

<input type="text" @keyup.enter="keyUp">

如果希望监听的是其他键,那可以把“.enter”改为“.”+按键对应的keycode 就可以了,这是keycode对照表:

字母和数字键的键码值(keyCode)
按键键码按键键码按键键码按键键码
A65J74S83149
B66K75T84250
C67L76U85351
D68M77V86452
E69N78W87553
F70O79X88654
G71P80Y89755
H72Q81Z90856
I73R82048957
数字键盘上的键的键码值(keyCode)
按键键码按键键码
0968104
1979105
298*106
399+107
4100Enter108
5101-109
6102.110
7103/111
功能键键码值(keyCode)
按键键码按键键码
F1112F7118
F2113F8119
F3114F9120
F4115F10121
F5116F11122
F6117F12123
控制键键码值(keyCode)
按键键码按键键码按键键码按键键码
BackSpace8Esc27Right Arrow39-_189
Tab9Spacebar32Dw Arrow40.>190
Clear12Page Up33Insert45/?191
Enter13Page Down34Delete46`~192
Shift16End35Num Lock144[{219
Control17Home36;:186\丨220
Alt18Left Arrow37=+187]}221
Cape Lock20Up Arrow38,<188'"222
多媒体键码值(keyCode)
按键键码
音量加175
音量减174
停止179
静音173
浏览器172
邮件180
搜索170
收藏171

来源:https://segmentfault.com/a/1190000005828048

4、.native修饰符

我们现在做了这么一个组件< cpon ></ cpon >,想要给它绑定一个点击事件完成某件事,但是如果直接给他绑定一个@click肯定是不能生效的。

<cpon @click="cpnClick"></cpon>

所以我们得借助.native修饰符,才能监听到该组件根元素的原生事件。

<cpon @click.native="cpnClick"></cpon>

5、.once修饰符

大家应该都有双十一双十二到点秒杀的经历,在抢秒杀商品时恨不得把屏幕都点穿,都不知道自己点过多少次。
也许点的人会觉得很爽,但是对于我们程序员来说就是个灾难,想象一下,数以万计的人同时在点击,而且单一个人就不知道点击了多少次,那这个秒杀的方法又需要执行多少次呢?
所以程序员就生气了,天天点点点的烦不烦,于是他就给程序加了个.once修饰符,告诉程序只有第一次的点击你要听,其他的时候装聋做哑就好了。

<button @click.once="btn2Click">按钮</button>

这样一来就皆大欢喜了,我们的第一位幸运儿抢到了东西很开心,其他人不知道自己的点击被无视了还在那里点得很开心,而我们作为程序员不用担心程序点击太多次而卡死也很开心。
其实这也是我们在做防抖节流优化时的一个思路,比如发现有人发信息给你分配任务时,先来一手假装不在,过会回来再看看他还有没有别的任务要你做,没有把第一件事做了再回信息告诉他这段时间你把他任务完成了,保证他不会因为你之前不回他信息而不高兴,而你也不用担心因为第一时间接了他的话而多了更多活。
之后我也会写一篇文章详细讲讲防抖节流,欢迎大家一起来讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值