事件处理

在 Vue.js 中,事件处理是响应用户交互的核心功能之一。通过绑定事件监听器、使用事件修饰符和按键修饰符,可以轻松实现灵活的交互逻辑。

绑定监听

在 Vue 中,通过 v-on 指令或其缩写 @ 来绑定事件监听器。例如:

<button @click="handleClick">点击我</button>

在这个例子中,当用户点击按钮时,会触发 handleClick 方法。

methods: {
handleClick() {
alert('按钮被点击了');
}
}

事件的基本使用:

  • 使用 v-on:xxx@xxx 绑定事件,其中xxx是事件名;

例如:v-on:click@click

  • 事件的回调需要配置在methods对象中,最终会在vm

  • methods中配置的函数,不要用箭头函数!否则this就不是vm

  • methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象;

  • @click=&quot;demo&quot;@click=&quot;demo($event)&quot; 效果一致,但后者可以传参;

事件对象 默认事件形参: event 隐含属性对象: $event

  • $event 就是当前触发事件的元素,即使不传 $event,在回调函数中也可以使用 event 这个参数。

v-on:xxx="fun"
@xxx="fun"
@xxx="fun(参数)"

示例代码

<body>
<div id="demo">
<h1>1. 绑定监听</h1>
<button @click="test1">test1</button>
<button @click="test2('abc')">test2</button>
<button @click="test3">test3</button>
<button @click="test4(123, $event)">test4</button>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>

<script>
new Vue({
el: "#demo",
data: {},
methods: {
test1() {
alert("hahah");
},
test2(msg) {
alert(msg);
},
test3(event) {
alert(event.target.innerHTML);
},
test4(number, event) {
alert(number + '—' + event.target.innerHTML);
}
}
})
</script>
</body>

事件修饰符

事件修饰符允许你修改事件处理程序的默认行为。这些修饰符包括 .stop, .prevent, .capture, .self, .once 等。

  • prevent:阻止默认事件(常用);event.preventDefault()

  • stop:阻止事件冒泡(常用);event.stopPropagation()

  • once:事件只触发一次(常用);

  • capture:使用事件的捕获模式;

  • self:只有event.target是当前操作的元素时才触发事件;

  • passive:事件的默认行为立即执行,无需等待事件回调执行完毕;

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>事件修饰符</title>
<!– 引入Vue –>
<script type="text/javascript" src="../js/vue.js"></script>
<style>
*{
margin-top: 20px;
}
.demo1{
height: 50px;
background-color: skyblue;
}
.box1{
padding: 5px;
background-color: skyblue;
}
.box2{
padding: 5px;
background-color: orange;
}
.list{
width: 200px;
height: 200px;
background-color: peru;
overflow: auto;
}
li{
height: 100px;
}
</style>
</head>
<body>
<!–
Vue中的事件修饰符:
1.prevent:阻止默认事件(常用);
2.stop:阻止事件冒泡(常用);
3.once:事件只触发一次(常用);
4.capture:使用事件的捕获模式;
5.self:只有event.target是当前操作的元素时才触发事件;
6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕;
–>
<!– 准备好一个容器–>
<div id="root">
<h2>欢迎来到{{name}}学习</h2>
<!– 阻止默认事件(常用) –>
<a href="http://www.baidu.com" @click.prevent="showInfo">点我提示信息</a>

		&lt;!-- 阻止事件冒泡(常用) 这将阻止点击事件冒泡到父元素。--&gt;
		&lt;div class=&quot;demo1&quot; @click=&quot;showInfo&quot;&gt;
			&lt;button @click.stop=&quot;showInfo&quot;&gt;点我提示信息&lt;/button&gt;
			&lt;!-- 修饰符可以连续写 --&gt;
			&lt;!-- &lt;a href=&quot;http://www.atguigu.com&quot; @click.prevent.stop=&quot;showInfo&quot;&gt;点我提示信息&lt;/a&gt; --&gt;
		&lt;/div&gt;

		&lt;!-- 事件只触发一次(常用) --&gt;
		&lt;button @click.once=&quot;showInfo&quot;&gt;点我提示信息&lt;/button&gt;

		&lt;!-- 使用事件的捕获模式 --&gt;
		&lt;div class=&quot;box1&quot; @click.capture=&quot;showMsg(1)&quot;&gt;
			div1
			&lt;div class=&quot;box2&quot; @click=&quot;showMsg(2)&quot;&gt;
				div2
			&lt;/div&gt;
		&lt;/div&gt;

		&lt;!-- 只有event.target是当前操作的元素时才触发事件; --&gt;
		&lt;div class=&quot;demo1&quot; @click.self=&quot;showInfo&quot;&gt;
			&lt;button @click=&quot;showInfo&quot;&gt;点我提示信息&lt;/button&gt;
		&lt;/div&gt;

		&lt;!-- 事件的默认行为立即执行,无需等待事件回调执行完毕; --&gt;
		&lt;ul @wheel.passive=&quot;demo&quot; class=&quot;list&quot;&gt;
			&lt;li&gt;1&lt;/li&gt;
			&lt;li&gt;2&lt;/li&gt;
			&lt;li&gt;3&lt;/li&gt;
			&lt;li&gt;4&lt;/li&gt;
		&lt;/ul&gt;

	&lt;/div&gt;
&lt;/body&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	new Vue(&#123;
		el:&#x27;#root&#x27;,
		data:&#123;
			name:&#x27;super&#x27;
		&#125;,
		methods:&#123;
			showInfo(e)&#123;
				alert(&#x27;同学你好!&#x27;)
				// console.log(e.target)
			&#125;,
			showMsg(msg)&#123;
				console.log(msg)
			&#125;,
			demo()&#123;
				for (let i = 0; i &lt; 100000; i++) &#123;
					console.log(&#x27;#&#x27;)
				&#125;
				console.log(&#x27;累坏了&#x27;)
			&#125;
		&#125;
	&#125;)
&lt;/script&gt;

</html>

按键修饰符

Vue 提供了按键修饰符,用于监听键盘事件,并指定响应的按键。这些修饰符包括 .enter, .tab, .delete, .esc, .space, .up, .down, .left, .right 等。

Vue中常用的按键别名:

回车 => enter
删除 => delete (捕获“删除”和“退格”键)
退出 => esc
空格 => space
换行 => tab (特殊,必须配合keydown去使用)
上 => up
下 => down
左 => left
右 => right

Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名)

系统修饰键(用法特殊):ctrlaltshiftmeta

  • 配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。

  • 配合keydown使用:正常触发事件。

也可以使用keyCode去指定具体的按键(不推荐)

Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名

<!– 任何按键按下都会触发回调函数 –>
<textarea @keyup="testKeyup"></textarea>

<!– 下面的两种写法效果是一致的 –>
<!– 使用按键码,回车键的keyCode是13 –>
<textarea @keyup.13="testKeyup"></textarea>

<!– 使用按键修饰符,因为回车键比较常用,所以vue为他设置了名称,可以直接使用enter来代替 –>
<textarea @keyup.enter="testKeyup"></textarea>

示例代码

<body>
<div id="demo">
<h1>3. 按键修饰符</h1>
<input type="text" @keyup.13="test8">
<input type="text" @keyup.enter="test8">
</div>

<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>

<script>
new Vue({
el: "#demo",
data: {},
methods: {
test8(event) {
// if(event.keyCode===13){ // 原来的做法
// alert(event.target.value);
// }
alert(event.target.value);
}
}
})
</script>
</body>