0
点赞
收藏
分享

微信扫一扫

【Vue】事件

吃面多放酱 2022-02-08 阅读 74

事件的绑定

v-on:事件类型="方法名 / 表达式 / 简单语句",缩写为 @事件类型="方法名 / 表达式 / 简单语句"

<div id="app">
    <input type="text" v-model="num">
    <button @click="removes">-</button>
    <button @click="add">+</button>
</div>
let app = new Vue({
    el: '#app',
    data: {
        num: 100
    },
    methods: { // methods 里存放方法,this 指向当前 vue 实例
        removes() {
            this.num--;
        },
        add() {
            this.num++;
        }
    }
});
  • 无参数时,不用写 (),写上 () 就是调用函数
  • 如果想调用事件函数时传递参数,可以在绑定事件时直接调用方法并传入参数
<input type="text" v-model="num">
<button @click="removes(2)">-2</button>
<button @click="add(2)">+2</button>
let app = new Vue({
    el: '#app',
    data: {
        num: 100
    },
    methods: { // methods 里存放方法,this 指向当前 vue 实例
        removes(val) {
            this.num -= val;
        },
        add(val) {
            this.num += val;
        }
    }
});
<button @click="fun1(), fun2()">绑定多个函数</button>
<!-- 注意:这里的函数名后有 () -->
let vm = new Vue({
    el: "#app",
    methods: {
        fun1() {
            console.log("first");
        },
        fun2() {
            console.log("second");
        }
    }
});
<button @click="num--">-</button>
<input type="text" v-model="num">
<button @click="num++">+</button>
let app = new Vue({
    el: '#app',
    data: {
        num: 100
    }
});

事件对象

<div id="app"> <button @click="fun">事件对象</button> </div>
let vm = new Vue({
    el: "#app",
    methods: {
        fun(event) {
            console.log("事件对象", event);
        }
    }
});
<button @click="fun(1, $event)">事件对象</button>
let vm = new Vue({
    el: "#app",
    methods: {
        fun(a, ev) {
            console.log(a, ev);
        }
    }
});

事件修饰符

<a href="https://www.baidu.com" @click.prevent="fun">百度链接(阻止默认事件)</a>
fun() {
    console.log("默认事件已被阻止!");
}
<div @click.once="fun">once 的使用</div>
fun() {
    console.log("事件只触发一次!");
}
<div class="father" @click="funFa">
    点击 father,则触发 funFa
    <div class="son" @click="funSon">点击 son,则先触发 funSon 然后触发 funFa</div>
</div>

<!-- 通过 stop 阻止冒泡 -->
<div class="father" @click="funFa">
    点击 father,则触发 funFa
    <div class="son" @click.stop="funSon">点击 son,则只触发 funSon</div>
</div>
funFa() {
    console.log("father");
},
funSon() {
    console.log("son");
}
<div class="father" @click="funFa">
    点击 father,则触发 funFa
    <div class="son" @click="funSon">点击 son,则先触发 funSon 然后触发 funFa</div>
</div>

<!-- 通过 capture 在捕获阶段触发事件 -->
<div class="father" @click.capture="funFa">
    点击 father,则触发 funFa
    <p class="son" @click="funSon">点击 son,则先触发 funFa 然后触发 funSon</p>
</div>
<div class="father" @click="funFa">
    点击 father,则触发 funFa
    <div class="son" @click="funSon">点击 son,则先触发 funSon 然后触发 funFa</div>
</div>

<!-- 通过 self 设置事件的触发 -->
<div class="father" @click.self="funFa">
    点击 father,则触发 funFa
    <p class="son" @click="funSon">点击 son,则触发 funSon</p>
</div>

一般配合滚动使用:

  • scroll 滚动条滚动时触发
  • wheel 滚轮滚动时触发

默认情况下,后续相同事件的触发,会在回调函数执行完毕之后

<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
<!-- 而不会等待 `onScroll` 完成  -->
<!-- 这其中包含 `event.preventDefault()` 的情况 -->
<div v-on:scroll.passive="onScroll">...</div>

不要将 .passive.prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。请记住,.passive 会告诉浏览器你不想阻止事件的默认行为

<div class="wrap" @contextmenu.once.prevent="fun">
    阻止右键一次默认事件
</div>
fun() {
    console.log("右键默认事件已被阻止");
}

注意:使用顺序不同,达到的效果也不同

按键修饰符

Vue 允许为 v-on 在监听键盘事件时添加按键修饰符

可指定 event.key = Enter (event.keyCode = 13) 时触发

<input type="text" @keyup.enter="fun" placeholder="enter">

类似的还有 .delete-退格/删除、.esc-返回、.space-空格、.up-上箭头、.down-下箭头、.left-左箭头、.right-右箭头

注意:event.key 值类似 PageDown 的,需要写成小写字母,单词之间用 - 连接

<!-- 松开 PageDown 键则触发 -->
<input type="text" @keyup.page-down="fun" placeholder="page-down">

tab 键用于切换焦点,需要配合 keydown 事件使用(不能配合 keyup 使用,因为还没触发 keyup,焦点就转移了)

<!-- 松开 tab 键不触发 -->
<input type="text" @keyup.tab="fun" placeholder="keyupTab">
<!-- 按下 tab 键才会触发 -->
<input type="text" @keydown.tab="fun" placeholder="keydownTab">

.ctrl.alt.shift.meta-windows键,这些键都需要配合 keydown 事件使用

<!-- 系统修饰符 按下触发-->
<input type="text" @keydown.ctrl="fun" placeholder="keydownCtrl">
<!-- 系统修饰符 抬起不会触发-->
<input type="text" @keyup.ctrl="fun" placeholder="keyupCtrl">

也可以和非键盘事件一起使用

<button @click.alt="fun">按下 alt 键的同时点击</button>

对于一般键:按下任意键即可触发

<!-- 松开 q / w 键则触发 -->
<input type="text" @keyup.q.w="fun" placeholder=".q.w">

对于系统键:需要同时按下才会触发(组合键)

<!-- 按下 ctrl & enter 键才触发 -->
<input type="text" @keydown.ctrl.enter="fun" placeholder="ctrl.enter">
<!-- 按下 ctrl & a 键才触发 -->
<input type="text" @keydown.ctrl.a="fun" placeholder="ctrl.a">

允许你控制由精确的系统修饰符组合触发的事件

<!-- 即使 Alt / Shift 被一同按下时也会触发 -->
<button v-on:click.ctrl="onClick">A</button>

<!-- 有且只有 Ctrl 被按下的时候才触发 -->
<button v-on:click.ctrl.exact="onCtrlClick">A</button>

<!-- 没有任何系统修饰符被按下的时候才触发 -->
<button @click.exact="onClick">A</button>
  • .left
  • .right
  • .middle
举报

相关推荐

0 条评论