03. Vue事件
事件监听
v-on绑定事件:在Vue中可以使用内置指令v-on监听DOM事件,并在触发时运行一些JavaScript代码,或绑定事件处理方法。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <button v-on:click="count = Math.random()">随机获取一个数字</button> <p>count : {{count}}</p> </div> <script> let vm = new Vue({ el: "#app", data: { count: 0 } }) </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <button v-on:click="calcount()">随机获取一个数字</button> <p>count : {{count}}</p> </div> <script> let vm = new Vue({ el: "#app", data: { count: 0 }, methods: { calcount(){ this.count = Math.random(); } } }) </script> </body> </html>
按键修饰符监听按键
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <input type="text" v-on:keyup.enter="submit()" /> <input type="text" v-on:keydown.enter="submit()" /> </div> <script> let vm = new Vue({ el: "#app", data: { }, methods: { submit(){ console.log("按了一下enter健") } } }) </script> </body> </html>
事件修饰符
修饰符 说明 .stop 阻止事件冒泡 .prevent 阻止默认事件行为 .capture 事件捕获 .self 将事件绑定到自身,只有自身才能触发 .once 事件只触发一次 .stop
事件冒泡
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <div @click="A()" style="background-color: aqua;width: 100%; height: 300px;"> <div @click="B()" style="background-color: coral; width: 100px; height: 300px;"></div> </div> </div> <script> let vm = new Vue({ el: "#app", data: { }, methods: { A(){ console.log("外层div被点击了!!!") }, B(){ console.log("内层div被点击了!!!") } } }) </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <div @click="A()" style="background-color: aqua;width: 100%; height: 300px;"> <div @click.stop="B()" style="background-color: coral; width: 100px; height: 300px;"></div> </div> </div> <script> let vm = new Vue({ el: "#app", data: { }, methods: { A(){ console.log("外层div被点击了!!!") }, B(){ console.log("内层div被点击了!!!") } } }) </script> </body> </html>
.prevent
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <a href="https://blog.csdn.net/Lvruoyu/article/details/124256279?spm=1001.2014.3001.5501"> Vue.js教程 </a> <br> <a href="https://blog.csdn.net/Lvruoyu/article/details/124256279?spm=1001.2014.3001.5501" @click.prevent> Vue.js教程 </a> </div> <script> let vm = new Vue({ el: "#app", data: { } }) </script> </body> </html>
.capture
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <div @click="doParent()" style="width: 100%;height: 300px; background-color: cadetblue;"> <button @click="doChildren()">事件捕获</button> </div> </div> <script> let vm = new Vue({ el: "#app", data: { }, methods: { doParent(){ console.log("我是父元素元素") }, doChildren(){ console.log("我是子元素元素") } } }) </script> </body> </html>
.self
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> <style> .div1{ background-color: cadetblue; width: 100px; height: 100px; margin: 5px; } .div2{ background-color: rgb(235, 243, 243); width: 80px; height: 80px; } </style> </head> <body> <div id="app"> <div class="div1" @click.self="doParent()">A <div class="div2" @click="doChildren()">B</div> </div> <br> <div class="div1" @click="doParent()">C <div class="div2" @click.self="doChildren()">D</div> </div> </div> <script> let vm = new Vue({ el: "#app", methods: { doParent(){ console.log("我是父元素元素") }, doChildren(){ console.log("我是子元素元素") } } }) </script> </body> </html>
.once
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <button @click.once="doParent()">点击</button> </div> <script> let vm = new Vue({ el: "#app", methods: { doParent(){ console.log("我是父元素元素") } } }) </script> </body> </html>