与用户进行交互时,需要监听到用户发生的事件,比如:点击、拖拽、键盘事件等等。
可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。
一、v-on的基本使用
<button v-on:click="counter++">+</button>
// v-on: 表示要绑定事件监听
// click: 绑定事件的类型,单击
// click="counter++":click后面接触发事件要执行的内容
<button @click="counter++">+</button> // 语法糖
<div id="app">
<button @click="increment">+</button>
<button @click="decrement">-</button>
<h2>{{counter}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el:'#app',
data:{
counter:0
},
methods:{
increment(){
this.counter++
},
decrement(){
this.counter--
}
}
})
</script>
二、v-on的参数问题
在绑定一个方法时,该方法中可能会传入参数,则需要去分析参数的问题。
当v-on绑定某个方法时:
(1)如果方法本身不传参数时,则方法中的()可加可不加
(2)如果函数本身需要一个参数,而没有加(),vue会将浏览器产生的event事件对象作为参数传入到方法
(3)方法定义时,我们需要event对象,同时又需要其他参数,则在调用方法时,我们可以通过$event
来手动获取到浏览器参数的event对象。
注意:$event 如果直接写event会报错,vue会把它当成一个变量
<div id="app">
<button @click="btn">按钮1</button>
<button @click="btn()">按钮1</button>
//绑定方法时,方法本身不用传参数时,()可加可不加都可以,效果一样
<button @click="btn2(123)">按钮2</button> // 123
<button @click="btn2()">按钮2</button> //为undefined
//没有传参数,而下面的方法里面需要接收参数,会打印出undefined
//事件调用的方法,方法本身要传参数时,若加(),则跟我们平时的一样
<button @click="btn2">按钮2</button> // MouseEvent对象
//绑定方法时,方法本身要传参数,若未加(),则默认传入事件对象event
<button @click="btn3(30,$event)">按钮3</button>
//方法定义时,若需要event事件对象和其他参数
//则可以传参$event,表示传的是event事件对象
</div>
<script>
const app = new Vue({
el:"#app",
data:{
message:"你好啊"
},
methods:{
btn(){
console.log("按钮1");
},
btn2(number){
console.log(number); //打印传参
},
btn3(number,event){
console.log("-----",number,event);
}
}
})
</script>
三、v-on的修饰符
1、在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求,Vue.js 为 v-on 提供了事件修饰符,可以更加轻松简洁地去实现。
2、修饰符的使用形式:
v-on:事件类型.修饰符 =" "
v-on:click.stop=“方法”
3、修饰符的种类(举例说明):
(1)<!-- 阻止单击事件继续传播即阻止事件冒泡 -->
<div @click.stop="doThis"></div>
(2)<!-- 提交事件不再重载页面即阻止默认行为 -->
<form @submit.prevent="onSubmit"></form>
(3)<!-- 点击事件将只会触发一次 -->
<a @click.once="doThis"></a>
(4)<!-- 按键修饰符 -->
<input @keyup.enter="submit">
<div id="app">
<div @click="Div">
aaa
<button @click.stop="Btn">按钮</button>
//1.阻止事件冒泡
</div>
//因为div和button都绑定了事件,我们点击按钮,因为事件冒泡,则会触发button和div的事件;
//在vue中,我们使用.stop修饰符就可以阻止事件冒泡了;
<form action="http://www.baidu.com">
<input type="submit" value="提交" @click.prevent="submitClick">
//2.绑定了单击事件,则向要取消它跳转的默认行为
//这样就可以自己在函数中收集数据,向服务器发请求-->
</form>
<input type="text" v-on:keyup="key" >
//3.监听键盘按键的抬起
<input type="text" v-on:keyup.enter="key" >
//则只监听键盘中enter键的点击,即抬起按键enter,就触发key方法
<button @click.once="Btn2">按钮2</button>
//4.只有第一次点击时触发,单击只触发一次
</div>
<script>
const app = new Vue({
el:"#app",
data:{
message:"你好啊"
},
methods:{
Div(){
console.log("Div");
},
Btn(){
console.log("Btn");
},
submitClick() {
console.log("取消默认行为");
},
key(){
console.log("key方法执行了");
},
Btn2(){
console.log("按钮2执行了");
}
}
})
</script>