Vue2事件及事件修饰符

简介: 从基础到实战,我们一环都不要少!

事件

传递参数

在事件函数上传递参数

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>事件</title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app">
        <h1>{
  { count }}</h1>
        <button @click="add(2)"> 🙋‍♀️ </button>
    </div>
    <script>
        let app = new Vue({
    
            el: "#app",
            data: {
    
                count: 0
            },
            methods: {
    
                add(n) {
    
                    this.count += n
                }
            }
        })
    </script>
</body>

</html>

传递事件对象

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>事件</title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app">
        <h1>{
  { count }}</h1>
        <button @click="add(3,$event)"> 🙋‍♀️ </button>
    </div>
    <script>
        let app = new Vue({
    
            el: "#app",
            data: {
    
                count: 1
            },
            methods: {
    
                add(n, event) {
    
                    this.count *= n
                    console.log(event)
                }
            }
        })
    </script>
</body>

</html>
---控制台---
PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …}
isTrusted: true
altKey: false
altitudeAngle: 1.5707963267948966
azimuthAngle: 0
bubbles: true
button: 0
buttons: 0
cancelBubble: false
cancelable:true
clientX: 22
clientY: 95
composed: true
ctrlKey: false
currentTarget: null
defaultPrevented: false
detail: 1
eventPhase: 0
fromElement: null
height: 1
isPrimary: false
layerX: 22
layerY: 95
metaKey: false
movementX: 0
movementY: 0
offsetX: 13
offsetY: 8
pageX: 22
pageY: 95
pointerId: 1
pointerType: "mouse"
pressure: 0
relatedTarget: null
returnValue: true
screenX: 70
screenY: 225
shiftKey: false
sourceCapabilities: InputDeviceCapabilities {firesTouchEvents: false}
srcElement: button
tangentialPressure: 0
target: button
tiltX: 0
tiltY: 0
timeStamp: 7497.4000000059605
toElement: null
twist: 0
type: "click"
view: Window {window: Window, self: Window, document: document, name: '', location: Location, …}
which: 1
width: 1
x: 22
y: 95
[[Prototype]]: PointerEvent

就一定要在调用时从传入$event,才可以在函数内打印出事件对象吗?

当绑定事件时,没有加小括号,会自动传入事件对象,如果加小括号,并且需要用到事件对象时,需要手动传入事件对象:$event

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>事件</title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app">
        <button @click="del"> 🙋‍♀️ </button>
    </div>
    <script>
        let app = new Vue({
    
            el: "#app",
            methods: {
    
                del(e) {
    
                    console.log(e);
                }
            }
        })
    </script>
</body>

</html>
---控制台---
PointerEvent

事件修饰符

prevent

阻止默认事件

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="vue.js"></script>
    <style>
        .box {
    
            width: 200px;
            height: 300px;
            border: 1px solid red;
        }
    </style>
</head>

<body>
    <div id="app">
        <div @contextmenu.prevent="rightMnue" class="box">
            {
  {msg}}
        </div>
    </div>
    <script>
        let app = new Vue({
    
            el: "#app",
            data: {
    
                msg: "Vue"
            },
            methods: {
    
                rightMnue() {
    
                    console.log('right click')
                }
            }
        })
    </script>
</body>

</html>

stop

阻止事件冒泡(事件冒泡是从内到外)

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .big-box {
    
            width: 400px;
            height: 400px;
            border: 1px solid red;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .small-box {
    
            width: 60px;
            height: 60px;
            background-color: pink;
        }
    </style>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app"></div>
    <div class="big-box" @click="bigBox">
        <h1>big box</h1>
        <div class="small-box" @click.stop="smallBox">
            <h6>small box</h6>
        </div>
    </div>
    <script>
        let app = new Vue({
    
            el: "#app",
            data: {
    },
            methods: {
    
                bigBox() {
    
                    console.log('小盒子被点击')
                },
                smallBox() {
    
                    console.log('小盒子被点击')
                }
            }
        })
    </script>
</body>

</html>
---控制台---
点击大盒子
log: 
大盒子被点击

点击小盒子
log: 
小盒子被点击 大盒子被点击

capture

事件捕获(事件捕获是从外到内)

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .big-box {
    
            width: 400px;
            height: 400px;
            border: 1px solid red;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .small-box {
    
            width: 60px;
            height: 60px;
            background-color: pink;
        }
    </style>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app"></div>
    <div class="big-box" @click.capture="bigBox">
        <h1>big box</h1>
        <div class="small-box" @click="smallBox">
            <h6>small box</h6>
        </div>
    </div>
    <script>
        let app = new Vue({
    
            el: "#app",
            data: {
    },
            methods: {
    
                bigBox() {
    
                    console.log('小盒子被点击')
                },
                smallBox() {
    
                    console.log('小盒子被点击')
                }
            }
        })
    </script>
</body>

</html>
---控制台---
点击大盒子
log: 大盒子被点击了
点击小盒子
log: 大盒子被点击 小盒子被点击

self

只有当事件的target是当前元素的时候,才会触发事件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .big-box {
    
            width: 400px;
            height: 400px;
            border: 1px solid red;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .small-box {
    
            width: 60px;
            height: 60px;
            background-color: pink;
        }
    </style>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app"></div>
    <div class="big-box" @click.self="bigBox">
        <h1>big box</h1>
        <div class="small-box" @click.self="smallBox">
            <h6>small box</h6>
        </div>
    </div>
    <script>
        let app = new Vue({
    
            el: "#app",
            data: {
    },
            methods: {
    
                bigBox(e) {
    
                    console.log('小盒子被点击', e.target)
                },
                smallBox(e) {
    
                    console.log('小盒子被点击', e.target)
                }
            }
        })
    </script>
</body>

</html>

once

表示事件是一次性绑定

代码示例

<div class="small-box" @click.once="smallBox">
small box
</div>

键盘事件修饰符

这些都是Vue封装好的键盘修饰符

  • enter

  • space 空格

  • delete

  • tab

  • shift

  • contrl

  • alt

  • esc

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app">
        <input type="text" @keyup.enter="add">
    </div>
    <script>
        let app = new Vue({
    
            el: "#app",
            data: {
    },
            methods: {
    
                console.log('你点击了Enter键')
            }
        })
    </script>
</body>

</html>

那对于键盘上未被 Vue 封装的按键呢?

可以使用其 keyCode 值

例如 A 键的 keyCode 为 65

<input type="text" @keyup.65="keyup">

鼠标事件修饰符

  • left

只有左键可以触发事件

  • middle

只有中间滚轮可以触发事件

  • right

只有右键可以触发事件

修饰符使用

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="vue.js"></script>
    <style>
        .box {
    
            width: 200px;
            height: 200px;
            border: 1px solid pink;
        }
    </style>
</head>

<body>
    <div id="app">
        <div class="box" @mouseup.left="mouseup"></div>
    </div>
    <script>
        let app = new Vue({
    
            el: "#app",
            methods: {
    
                mouseup(e) {
    
                    console.log(e);
                }
            }
        })
    </script>
</body>

</html>
目录
相关文章
|
JSON JavaScript 前端开发
Android 缩减、混淆处理和优化应用研究(二)
Android 缩减、混淆处理和优化应用研究(二)
235 1
|
弹性计算 Cloud Native 云计算
云计算|云计算的一些基础概念(HCS和OpenStack)
云计算|云计算的一些基础概念(HCS和OpenStack)
1898 0
|
JavaScript IDE 开发工具
在vue项目中禁用eslint
这篇文章提供了多种方法来禁用Vue项目中的ESLint校验,包括修改配置文件和IDE设置,以适应不同版本的Vue项目和开发者的需求。
在vue项目中禁用eslint
|
12月前
|
机器学习/深度学习 人工智能 自动驾驶
2024.10|AI/大模型在机器人/自动驾驶/智能驾舱领域的最新应用和深度洞察
本文介绍了AI和大模型在机器人、自动驾驶和智能座舱领域的最新应用和技术进展。涵盖多模态大语言模型在机器人控制中的应用、移动机器人(AMRs)的规模化部署、协作机器人的智能与安全性提升、AR/VR技术在机器人培训中的应用、数字孪生技术的优化作用、Rust语言在机器人编程中的崛起,以及大模型在自动驾驶中的核心地位、端到端自动驾驶解决方案、全球自动驾驶的前沿进展、智能座舱的核心技术演变和未来发展趋势。
879 2
|
12月前
|
网络协议 数据格式
【通信协议讲解】单片机基础重点通信协议解析与总结之ModBus(五)
【通信协议讲解】单片机基础重点通信协议解析与总结之ModBus(五)
252 1
|
监控 Linux Shell
30 个实用的 Linux 命令贴与技巧,提升你的效率(附实战案例)
本文介绍了30个实用的Linux命令及其应用场景,帮助你提升命令行操作效率。涵盖返回目录、重新执行命令、查看磁盘使用情况、查找文件、进程管理、网络状态监控、定时任务设置等功能,适合各水平的Linux用户学习和参考。
|
存储 监控 数据挖掘
ERP系统中的客户满意度调查与反馈处理解析
【7月更文挑战第25天】 ERP系统中的客户满意度调查与反馈处理解析
1016 0
|
前端开发 UED
🌟前端分页加载/懒加载预览PDF🌟
🌟前端分页加载/懒加载预览PDF🌟
|
算法 定位技术 图形学
基于Pix4Dmapper的运动结构恢复无人机影像三维模型重建
基于Pix4Dmapper的运动结构恢复无人机影像三维模型重建
303 2