一、v-on:你和网页的“微信对话框”
想象一下:网页是个高冷的朋友,你戳他一下(点击),他才会回话。而v-on就是他的微信号,负责把你的动作翻译成他懂的语言!比如你敲键盘、点鼠标、甚至手机划屏,全靠v-on帮你传话。
传统JS事件绑定多麻烦? 得写addEventListener,还要记得解绑,代码乱成毛线团。Vue的v-on直接用@符号搞定(是的,@是v-on的缩写),比如:
<button @click="showAlert">戳我有惊喜!</button>
就这么一行,点击按钮自动触发showAlert方法!Vue还贴心帮你自动管理事件销毁,再也不用担心内存泄漏。
👉 新手常见坑:方法名别写成函数调用!比如@click="showAlert()"反而会直接执行。要像叫人名字,不是催人干活!
二、v-on基础玩法:从“点外卖”到“打游戏”
1. 点击事件:点奶茶式交互
<div id="app">
<button @click="orderMilkTea">加一杯珍珠奶茶</button>
<p>订单:{{ milkTeaCount }}杯</p>
</div>
<script>
new Vue({
el: '#app',
data: { milkTeaCount: 0 },
methods: {
orderMilkTea() {
this.milkTeaCount++;
console.log('奶茶正在制作中...');
}
}
})
</script>
逻辑解析:点击按钮就像扫码点单,orderMilkTea方法被调用,数据实时更新。比线下喊服务员还快!
2. 键盘事件:游戏作弊码既视感
<input @keyup.enter="submitForm" placeholder="按回车发送">
比如聊天框,按回车直接发送。Vue内置了enter、tab等常见键的别名,不用背键码值!
3. 鼠标事件:悬停查看隐藏彩蛋
<img @mouseover="showHint" src="谜题图片.jpg">
鼠标悬停图片时显示提示,适合游戏说明或产品介绍。
三、高级技巧:事件修饰符,你的“防手残神器”
场景1:点外卖但怕手抖下错单?
用.stop阻止事件冒泡:
<div @click="close菜单">
<button @click.stop="下单">确认下单</button>
</div>
比喻:就像奶茶杯套了防烫圈,点击按钮不会触发外层div的关闭事件!
场景2:提交表单但不想刷新页面?
用.prevent阻止默认行为:
<form @submit.prevent="handleSubmit">
<input type="submit" value="提交">
</form>
相当于默认的刷新页面行为被“截胡”,全权交给Vue处理。
场景3:游戏大招冷却期?用.once限制触发次数
<button @click.once="releaseUltimate">必杀技(仅一次)</button>
点击一次后自动失效,防止玩家狂按作弊。
四、实战代码:动态任务管理器(直接复制可用)
功能:添加任务、标记完成、悬停预览、快捷键删除
<!DOCTYPE html>
<html>
<head>
<title>v-on实战:任务管理器</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<style>
.completed { text-decoration: line-through; }
.task { cursor: pointer; margin: 10px; padding: 10px; border: 1px solid #ccc; }
</style>
</head>
<body>
<div id="app">
<input v-model="newTask" @keyup.enter="addTask" placeholder="输入任务,按回车添加">
<ul>
<li v-for="(task, index) in tasks"
:class="{ completed: task.done }"
@click="task.done = !task.done"
@mouseover="showDetail(index)"
@mouseleave="hideDetail">
{{ task.name }}
<button @click.stop="deleteTask(index)">删除</button>
<span v-if="task.showHint" style="color:gray">(右键可标记完成)</span>
</li>
</ul>
<p>已完成:{{ completedCount }} / {{ tasks.length }}</p>
</div>
<script>
new Vue({
el: '#app',
data: {
newTask: '',
tasks: []
},
computed: {
completedCount() {
return this.tasks.filter(t => t.done).length;
}
},
methods: {
addTask() {
if (this.newTask.trim()) {
this.tasks.push({
name: this.newTask,
done: false,
showHint: false
});
this.newTask = '';
}
},
deleteTask(index) {
this.tasks.splice(index, 1);
},
showDetail(index) {
this.tasks[index].showHint = true;
},
hideDetail() {
this.tasks.forEach(task => task.showHint = false);
}
}
})
</script>
</body>
</html>
代码亮点拆解:
@keyup.enter:回车快速添加任务,符合用户习惯@click切换完成状态,@click.stop防止点击删除时误触发完成- 鼠标悬停提示用
@mouseover和@mouseleave控制显隐 - 计算属性
completedCount自动统计进度,数据驱动界面更新
五、避坑指南:v-on常见翻车现场
- 方法在模板里不生效? 检查是否在
methods中定义,而非data里!
需要事件对象怎么办? 直接传$event:
<button @click="handleClick('参数', $event)">提交</button>
- 动态事件名:用方括号
@[eventName],比如事件名根据场景切换。
结语:v-on是Vue的“社交达人”
它让网页从静态说明书变成能聊天的伙伴。掌握v-on后,你会发现交互设计就像教朋友懂你的暗号:点击是“嗨”,悬停是“你猜猜”,键盘事件是“摩斯密码”…… 剩下的,就是尽情创造让用户惊喜的对话了!
彩蛋:用@dblclick实现双击彩蛋效果,比如连续点击LOGO三次触发隐藏动画——这不就是互联网时代的“芝麻开门”吗?

被折叠的 条评论
为什么被折叠?



