Vue2.0学习笔记3:事件

目录

一、事件处理

1.绑定事件:

2.事件的回调

3.传递参数

二、事件修饰符

1.事件修饰符的用处:

2.Vue中的事件修饰符

1.prevent:阻止默认事件:

2.stop:阻止事件冒泡:

3.once:事件只能触发一次

4.capture:使用事件的捕获模式:

5.self:只有event.target是当前操作的元素时才是触发事件

6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕:

三、键盘绑定

1.介绍

2.用法

1.Vue中的按键别名

2.Vue中未提供别名的按键

3.系统修饰键

4.使用keyCode

5.自定义键名


一、事件处理

1.绑定事件:

使用v-on:xxx@xxx 绑定事件,其中xxx是事件名,如

    <button v-on:click="showInfo1">提示信息1</button><br>
    <button @click="showInfo2(66,$event)">提示信息2</button><br>

2.事件的回调

需要配置在methods对象中,最终会出现在vm上。vm是Vue的实例对象,其中只有data对象会出现数据代理,而methods对象不会出现数据代理。

mwthods中配置的函数,不能用箭头函数,否则this就不是vm了。此时,methods中所配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象

    new Vue({
        el:'#root',
        data:{
            name:'hnucm'
        },
        methods:{
            showInfo1(event){
                console.log(event.target.innerText) //控制台输出事件中的文本信息
                alert('同学你好')
            },
            showInfo2(number,a){
                console.log(number,a)
            }
        }
    })

注意:事件的回调默认出现在事件的默认行为之前。在这里事件的回调是实例中的函数。例如:

<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
    <a href="http://www.4399.com" @click="showInfo">点我去学习</a>
</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399小游戏'
        },
        methods:{
            showInfo(e){
                alert('确定要去学习?')
            }
        }
    })

</script>

 在上面的例子中,弹窗在事件的回调中,而页面的跳转是事件的默认行为。所以,弹窗出现在页面跳转之前

3.传递参数

使用@click="demo" @click="demo($event)" 都可以绑定事件,但是后者可以传递参数。需要传递event参数时,可以加上$event来传递event对象。

注意:传递的参数与接受的参数顺序需要保持一致


二、事件修饰符

1.事件修饰符的用处:

顾名思义,“事件修饰符”是用来修饰事件的。Vue.js为v-on提供了事件修饰符,修饰符是由点开头的指令后缀来表示的。它可以更加方便的处理在事件的执行的各种需要,如默认事件的出现、事件触发次数等。

2.Vue中的事件修饰符

1.prevent:阻止默认事件(常用)
2.stop:阻止事件冒泡(常用)
3.once:事件只能触发一次(常用)
4.capture:使用事件的捕获模式
5.self:只有event.target是当前操作的元素时才是触发事件
6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕

1.prevent:阻止默认事件:

阻止行为如点击中会出现的默认行为。

在下面的例子中,默认的行为就是页面跳转,而@click.prevent="showInfo" 则阻止了这个行为。所以页面只是跳出弹窗,并不进行跳转

<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
    <!--  prevent:阻止默认事件(常用)  -->
    <a href="http://www.4399.com" @click.prevent="showInfo">点我去学习</a>
</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399小游戏'
        },
        methods:{
            showInfo(e){
                // e.preventDefault()  //阻止点击会出现的默认行为
                alert('确定要去学习?')
            }
        }
    })

</script>

2.stop:阻止事件冒泡:

首先了解两个概念:

事件捕获:从字面意思上看,就是事件的捕获。事件的捕获是从父级传播到子级的(由外向内)。

事件冒泡:事件的传播。事件源本身(可能)并没有处理事件的能力,即处理事件的函数(方法)并未绑定在该事件源上。例如我们点击一个按钮时,就会产生一个click事件,但这个按钮本身可能不能处理这个事件,事件必须从这个按钮传播出去,从而到达能够处理这个事件的代码中(例如我们给按钮的onclick属性赋一个函数的名字,就是让这个函数去处理该按钮的click事件),或者按钮的父级绑定有事件函数,当该点击事件发生在按钮上,按钮本身并无处理事件函数,则传播到父级去处理(由内向外)。

事件先捕获,再冒泡

问题提出:假如有一个按钮,它和它的父级都绑定了相同的事件,当我们点击它时,这个事件就会被执行两次。

阻止事件冒泡,就是为了解决这类事情。

在下面的例子中,原本弹窗在按下按钮“点我去学习1”后将出现两次,而使用@click.stop="showInfo" 将会阻止事件冒泡,使其只出现一次。需要注意的是,如果<div>还有父节点也可能出现冒泡,则<div>也需要stop

<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
    <!--  stop:阻止事件冒泡(常用)  -->
    <div @click="showInfo">
        <button @click.stop="showInfo">点我去学习1</button>
    </div>
</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399小游戏'
        },
        methods:{
            showInfo(e){
                //e.stopPropagation()     //阻止事件冒泡
                alert('确定要去学习?')
            }
        }
    })

</script>

3.once:事件只能触发一次

表示在页面中这个点击事件只能触发一次,之后再点击按钮事件就不触发了

<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
    <button @click.once="showInfo">点我去学习1</button>
</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399小游戏'
        },
        methods:{
            showInfo(e){
                alert('确定要去学习?')
            }
        }
    })

4.capture:使用事件的捕获模式:

上面已经提到,事件先捕获,再冒泡,并且捕获阶段是由外向内的,冒泡阶段是由内向外的。使用事件的捕获模式,可以使得事件的响应顺序发生变化,使其由外向内发生相应。

下面的例子中,点击里面的div2,在弹窗中出来的顺序是先1后2

<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
<!--  capture:使用事件的捕获模式  -->
    <div @click="showMsg(1)">div1
        <div @click.capture="showMsg(2)">div2</div>
    </div>

</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399小游戏'
        },
        methods:{
            showMsg(msg){
                alert(msg)
            }
        }
    })

</script>

5.self:只有event.target是当前操作的元素时才是触发事件

event.target是触发事件的对象的引用。可以粗略的认为是触发该事件的某个元素(DOM)的引用。

使用self事件修饰符后,被修饰的元素被点击才是触发事件的唯一条件。

在下面的例子中,触发弹窗“1”的条件变成了点击div1,而无法点击按钮来通过冒泡来触发它了

<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
<!--  self:只有event.target是当前操作的元素时才是触发事件  -->
    <div @click.self="showMsg(1)">div1
        <button @click="showInfo">点我去学习2</button>
    </div>
</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399小游戏'
        },
        methods:{
            showInfo(e){
                alert('确定要去学习?')
            },
            showMsg(msg){
                alert(msg)
            }
        }
    })

</script>

6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕:

一般的,在事件响应时,回调默认在事件的默认行为之前。在使用passive事件修饰符后,使得事件可以先执行它的默认行为,而无需等待事件回调执行完毕。

在下面这个例子中,如果没有passive事件修饰符,那么滚动鼠标滚轮后,会先执行回调,而回调中的函数(这里是for循环)较为耗时,所以会导致事件的默认行为(这里是无序列表的滚动)不能按时执行。而使用passive后,问题得到了解决

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xxx</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    <style>
        .list{
            width: 200px;
            height: 200px;
            background: gold;
            overflow: auto;
        }
        li{
            height: 100px;
        }
    </style>
</head>
<body>
<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
<!--  passive:事件的默认行为立即执行,无需等待事件回调执行完毕  -->
<!--  scroll:键盘或者鼠标滚轮使得界面滚动时触发,单位px  -->
<!--  wheel:鼠标滚轮滚动时触发,单位是鼠标滚轮触发的次数  -->
    <ul class="list" @wheel="demo">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>

</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399小游戏'
        },
        methods:{
            demo(){
                for(let i=0;i<10000;i++){
                    console.log('#')
                }
                console.log('累坏了')
            }
        }
    })

</script>
</body>
</html>


三、键盘绑定

1.介绍

当我们想要通过键盘按键来触发事件(例如按下回车,页面出现弹框)时,键盘绑定就可以给我们发挥作用了。

通过在事件绑定的前面加上键盘绑定,来绑定事件。

例如想要在输入文本时,按下Enter键触发弹窗,Enter键的别名在Vue中就是enter。示例代码如下:

<!--键盘事件-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xxx</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
    <!--  keydown:在键盘按下时触发      keyup:在键盘松开时触发  -->
    <input type="text" placeholder="按下回车提示输入" @keyup.enter="showInfo">
</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399'
        },
        methods:{
            showInfo(e){
                alert(e.target.value)        //显示文本框中的值
            }
        }
    })

</script>
</body>
</html>

2.用法

在Vue中,一些常用的按键是有别名的,方便使用。没有提供别名的按键,可以通过其他方法来进行键盘绑定

1.Vue中的按键别名:
    回车 => enter
    删除 => delete (捕获“删除”和“退格”键)
    退出 => esc
    空格 => space
    换行 => tab   (特殊,需要配合keydown使用)
    上 => up
    下 => down
    左 => left
    右 => right
2.Vue中未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名:key值中的大写字母全转为小写,单词之间用短横线隔开)
3.系统修饰键(用法特殊):ctrl、alt、shift、meta(win)
    (1)配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才触发
    (2)配合keydown使用:正常触发事件
4.也可以使用keyCode去指定具体的按键(不推荐)
5.Vue.config.keyCodes.自定义键名 = 键码  ,可以去定制按键别名

1.Vue中的按键别名

Vue中的按键别名在上一个示例中使用过了,故不再演示。

2.Vue中未提供别名的按键

未提供别名的按键,可以通过它原始的key值绑定(注意不是keyCode)

但是注意:使用的时候需要将key的每一个单词小写,并且单词之间需要有短横线作为分隔。如(CapsLk = caps-lock)

示例:

<!--键盘事件-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xxx</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
    <!--  keydown:在键盘按下时触发      keyup:在键盘松开时触发  -->
    <input type="text" placeholder="按下大小写切换提示输入" @keyup.caps-lock="showInfo">
</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399'
        },
        methods:{
            showInfo(e){
                alert(e.target.value)       //显示文本框中的值
            }
        }
    })

</script>
</body>
</html>

3.系统修饰键

ctrl、alt、shift、meta(win)是比较特殊的键。

1.在配合keyup使用时,按下修饰键的同时,再按下其他键,随后释放其他键,事件才触发。

        例如cirl+i或者ctrl+x亦或者ctrl+p都可以使得事件触发,当且仅当ctrl的x(可以是任何键)释放的时候,事件才被触发。

        当我们想要使得只有在ctrl+x时事件才被触发,可以这样:

<input type="text" placeholder="按下回车提示输入" @keyup.ctrl.x="showInfo">

这个x键也可以替换成其他的键。

2.在配合keydown使用时,才是正常触发事件。

需要注意的是,虽然TAB键不属于系统修饰键的一种,但它的功能主要是元素间焦点的切换,所以需要配合keydown使用才有效。

4.使用keyCode

因为keyCode在规定中已经被废弃使用,虽然在有些浏览器中仍然支持,但是建议最好不去使用

如何知道一个键的keyCode值呢?如下面的示例,可以通过控制台输出得到它的keyCode值

<!--键盘事件-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xxx</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
    <!--  keydown:在键盘按下时触发      keyup:在键盘松开时触发  -->
    <input type="text" placeholder="按下大小写切换(CapsLk)提示输入" @keyup.caps-lock="showInfo">
</div>
<script type="text/javascript">
    Vue.config.productionTip = false

    new Vue({
        el:'#root',
        data:{
            name:'4399'
        },
        methods:{
            showInfo(e){
                // alert(e.target.value)       //显示文本框中的值
                console.log(e.key,e.keyCode)   //显示该键的key值和keyCode值
            }
        }
    })

</script>
</body>
</html>

在文本框中按下CapsLk后,控制台得到了keyCode:

5.自定义键名

Vue.config.keyCodes.自定义键名 = 键码

这里可以去定制按键别名

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值