ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] >[success] # 事件绑定 1. **event问题** :**event** 的部分场景,如何使用 2. **一个事件执行多个函数** 3. **事件修饰符** :解决 **事件冒泡** 等问题 4. **按键修饰符**: **回车键** 、 **tab键** 等等 5. **鼠标修饰符** : **鼠标对应的左中右按键修饰符** 6. **精确修饰符** : **组合按键一起按才会触发方法** >[success] ## event问题 如果我们要 **额外传递参数 ,还要用到原生 event 对象时**,在 **实参** 的地方传入一个 **$event** , **形参** 的地方接收一下即可,如下代码: **index.html** ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>事件绑定</title> <!-- 通过cdn方式引入vue --> <script src="https://unpkg.com/vue@next"></script> </head> <body> <div id="root"></div> </body> <script> const app = Vue.createApp({ data(){ return { counter: 0 } }, methods: { handleAddBtnClick(num, event){ console.log(event.target) this.counter += num } }, template: ` {{counter}} <button @click="handleAddBtnClick(2, $event)">button</button> ` }) const vm = app.mount('#root') </script> </html> ~~~ >[success] ## 一个事件执行多个函数 在 **vue** 中有时候你想通过一个 **点击事件同时执行2个或多个方法** 时,你可以向下面代码一样,通过 **逗号分隔** 的形式来执行多个函数。 **index.html** ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>事件绑定</title> <!-- 通过cdn方式引入vue --> <script src="https://unpkg.com/vue@next"></script> </head> <body> <div id="root"></div> </body> <script> const app = Vue.createApp({ methods: { handleAddBtnClick(){ alert(1) }, handleAddBtnClick2(){ alert(2) } }, template: ` <button @click="handleAddBtnClick(),handleAddBtnClick2()">button</button> ` }) const vm = app.mount('#root') </script> </html> ~~~ >[success] ## 事件修饰符 1. **stop修饰符** **子容器** 与 **父容器** 都有 **点击事件** 时,**点击子容器,父容器的方法也会被触发** ,这种行为被称之为 **事件冒泡** ,为了解决该问题, **vue** 中提供了 **stop事件修饰符** 来解决该问题。 **index.html** ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>事件绑定</title> <!-- 通过cdn方式引入vue --> <script src="https://unpkg.com/vue@next"></script> </head> <body> <div id="root"></div> </body> <script> const app = Vue.createApp({ data(){ return { counter: 0 } }, methods: { handleAddBtnClick(num, event){ console.log(event.target) this.counter += num }, handleDivClick(){ alert('div click') } }, template: ` {{counter}} <div @click="handleDivClick"> <button @click.stop="handleAddBtnClick(2, $event)">button</button> </div> ` }) const vm = app.mount('#root') </script> </html> ~~~ 2. **self修饰符** 在 **父子嵌套** 的结构中,只想 **通过点击父级触发父级的事件,点击子级不触发父级的事件**,可以通过 **self修饰符** 来解决此问题。 **index.html** ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>事件绑定</title> <!-- 通过cdn方式引入vue --> <script src="https://unpkg.com/vue@next"></script> </head> <body> <div id="root"></div> </body> <script> const app = Vue.createApp({ data(){ return { counter: 0 } }, methods: { handleAddBtnClick(num, event){ console.log(event.target) this.counter += num }, handleDivClick(){ alert('div click') } }, template: ` <div @click.self="handleDivClick"> {{counter}} <button @click="handleAddBtnClick(2, $event)">button</button> </div> ` }) const vm = app.mount('#root') </script> </html> ~~~ 3. **prevent修饰符** 阻止默认行为修饰符 4. **capture修饰符** **捕获模式** : **冒泡模式** 是从内到外,**捕获模式** 是从外到内,这个平时用的不多。 5. **once修饰符** **once**: 事件只执行一次。 **index.html** ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>事件绑定</title> <!-- 通过cdn方式引入vue --> <script src="https://unpkg.com/vue@next"></script> </head> <body> <div id="root"></div> </body> <script> const app = Vue.createApp({ methods: { handleDivClick(){ alert('div click') } }, template: ` <div @click.once="handleDivClick"> 点击我 </div> ` }) const vm = app.mount('#root') </script> </html> ~~~ 5. **passive修饰符** **passive修饰符** 在使用 **@scroll事件** 时使用,性能会得到很大提升。 >[success] ## 按键修饰符 **vue** 中除了 **事件修饰符** 还有 **按键修饰符** ,这里就例举一些, **enter** 、**tab** 、**delete** 、 **esc** 、 **up**、 **down** 、**left** 、 **right** 这些修饰符都可以使用,可以通过这些 **修饰符** 用 **keydown** 进行一些按键的绑定。 1. **enter修饰符** 以前用 **原生js** 想实现 **按回车键触发一个方法** ,就需要用 **event** 中的 **keyCode** 判断等不等 **13** ,如果等于 **13** 就证明是 **回车键** ,再执行该方法,**vue** 中可以用 **enter按键修饰符** 来解决此问题。 **index.html** ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>事件绑定</title> <!-- 通过cdn方式引入vue --> <script src="https://unpkg.com/vue@next"></script> </head> <body> <div id="root"></div> </body> <script> const app = Vue.createApp({ methods: { // 原生写法想实现回车键就只能用event的keyCode === 13 代表是回车键 handleKeyDown(){ console.log('keydown') } }, template: ` <div> <input @keydown.enter="handleKeyDown"/> </div> ` }) const vm = app.mount('#root') </script> </html> ~~~ >[success] ## 鼠标修饰符 **鼠标修饰符** 有 **3** 个: **left** 、 **right** 、 **middle** ,接下來就拿 **middle** 举例: 1. **middle修饰符** **index.html** ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>事件绑定</title> <!-- 通过cdn方式引入vue --> <script src="https://unpkg.com/vue@next"></script> </head> <body> <div id="root"></div> </body> <script> const app = Vue.createApp({ methods: { handleClick(){ console.log('handleClick') } }, template: ` <div> <div @click.middle="handleClick">点击</div> </div> ` }) const vm = app.mount('#root') </script> </html> ~~~ >[success] ## 精确修饰符 **精确修饰符** 是什么意思呢,看下面代码,意思是 **必须按住 ctrl 再按住鼠标触发 click 键时候才会执行要执行的函数** **index.html** ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>事件绑定</title> <!-- 通过cdn方式引入vue --> <script src="https://unpkg.com/vue@next"></script> </head> <body> <div id="root"></div> </body> <script> const app = Vue.createApp({ methods: { handleClick(){ console.log('handleClick') } }, template: ` <div> <div @click.ctrl="handleClick">点击</div> </div> ` }) const vm = app.mount('#root') </script> </html> ~~~ **按住 ctrl + click ,此时再按住其他按键,也可以触发方法** ,有时候就是想 **只按住这两个按键(ctrl + click)** 触发方法,那应该如何解决呢,可以再加个 **.exact修饰符** ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>事件绑定</title> <!-- 通过cdn方式引入vue --> <script src="https://unpkg.com/vue@next"></script> </head> <body> <div id="root"></div> </body> <script> const app = Vue.createApp({ methods: { handleClick(){ console.log('handleClick') } }, template: ` <div> <div @click.ctrl.exact="handleClick">点击</div> </div> ` }) const vm = app.mount('#root') </script> </html> ~~~