5. 事件处理
事件的基本使用
- 使用
v-on:xxx
或者@xxx
绑定事件,其中xxx是事件名 - 事件的回调需要配置在
methods
对象中,最终会在vm里面 - methods中配置的函数,不要用箭头函数 ,否则使用this指的不是vm
- methods中配置的函数,都是被Vue所管理的函数,this指向的是vm或组件实例对象
@click="demo"
和@click="demo($event)"
效果一样,但后者可以传参,例如@click="demo($event, 66)"
, 这里指传入数字66
事件修饰符
Vue中的事件修饰符
prevent
:阻止默认事件(常用)
<a href="https://www.baidu.com" @click.prevent="showInfo">点我</a>
//默认事件为跳转页面,这里阻止了页面跳转
-
stop
:阻止事件冒泡(常用) -
once
:事件只触发一次(常用) -
capture
:使用事件的捕获模式 -
self
:只有event.target是当前操作的元素时,才触发事件 -
passive
:事件的默认行为立即执行,无需等待事件回调执行完毕
<div id="room">
<h3>修饰符可以链式调用。 例如: @click.prevent.stop </h3>
<!-- 这里阻止了a标签的默认跳转网页事件 -->
<a href="https://www.baidu.com" @click.prevent="showInfo">点我</a>
<div class="demo" @click="showInfo">
<button @click.stop="showInfo">阻止事件冒泡</button>
</div>
<button @click.once="showInfo">只触发一次</button>
<!-- 使用事件捕获模式 -->
<!-- 事件有捕获阶段(从外往内)和冒泡阶段(从内往外) ,一般事件处理是在冒泡阶段,所以点击div2时,先打印2再打印1。可以用capture使事件处理在捕获阶段,这样就是先打印1再打印2-->
<div class="box1" @click.capture="showMsg(1)">
div1
<div class="box2" @click="showMsg(2)">
div2
</div>
</div>
<!-- 只有event.target是当前操作的元素时才触发事件 -->
<!-- 本来点击按钮会冒泡到div,从而触发两次点击事件,但是div加了self后,由于点击的是btn,所以event.target是btn而不是div,所以不会触发div的点击事件(阻止冒泡的另一种方式)-->
<div class="demo" @click.self="showInfo">
<button @click="showInfo">点我</button>
</div>
<!-- 事件的默认行为立即执行,无需等待时间回调执行完毕 -->
<!-- 滚动事件分为:滚动条滚动scroll && 鼠标滚轮滚动wheel -->
<!-- 滚动条滚动,一旦滚动到底,就不再触发滚动事件里的代码;先滚动条滚动再触发事件里的代码 -->
<!-- 鼠标滚轮只要一直滚,滚动条到底了也可以继续执行滚动事件里的代码;先触发事件里的代码再滚动 -->
<!-- 所以这里如果使用wheel就需要优化,使用passive,让代码立即执行,无需等待滚动条滚动 -->
<div class="list" @wheel.passive="demo">
<li></li>
<li></li>
<li></li>
<li></li>
</div>
</div>
<script>
// 创建Vue实例
const vm = new Vue({
el: '#room',
data: {
name: 'cloud'
},
methods: {
showInfo(e) {
// e.preventDefault();// a的默认事件是跳转页面,这个方法可以阻止默认事件
//e.stopPropagation();//阻止事件冒泡
alert('你好')
},
showMsg(msg) {
console.log(msg)
},
demo() {
for(let i = 0; i < 10000; i++) {
console.log('$')
}
console.log('finish')
}
},
})
</script>
键盘事件
键盘上的每个按键都有自己的名称和编码,例如:Enter(13).Vue还对一些常用的按键起了别名便于使用
Vue中常用的按键别名
enter
:回车delete
:删除(捕获delete键和<———键)esc
:退出space
:空格tab
:换行,必须配合keydown使用up
:上down
:下left
:左right
:右
Vue未提供别名的按键
可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名)
<!-- 使用自定义键名 -->
<input type="text" name="" id="" @keydown.huiche="showInfo">
...
//声明自定义键名
//Vue.config.keyCodes.自定义键名 = 键码
Vue.config.keyCodes.huiche = 13
系统修饰符(特殊)
例如ctrl、alt、shift、meta(win键)等都是系统修饰符
- 配合
keyup
使用:按下修饰键的特殊,再按下其他键,随后释放其他键,事件才被触发 - 配合
keydown
使用:正常触发事件
<div id="room">
<h1>
Hello, {{name}}
</h1>
<h3>keyup:按下后松手才触发</h3>
<h3>keydown:按下后就触发</h3>
<input type="text" placeholder="按下回车提示输入" @keyup="showInfo">
<h3>自定义键名</h3>
<input type="text" name="" id="" @keydown.huiche="showInfo">
<h3>按下tab</h3>
<!-- tab只适合跟keydown配合使用,因为tab一按下,焦点就会离开输入框,而事件的对象又是这个输入框,所以如果用up则无法触发事件</br> -->
<input type="text" @keyup.tab="showInfo">
<!-- 系统修饰键指定某个按键配合使用,例如ctrl+y才触发事件 -->
<input type="text" name="" id="" @keyup.ctrl.y="showInfo">
</div>
<script>
//自定义键名
Vue.config.keyCodes.huiche = 13
const vm = new Vue({
el: '#room',
data: {
name: 'cloud'
},
methods: {
showInfo(e) {
// if (e.keyCode !== 97) return
console.log(e.keyCode)
}
}
})
</script>