Vue事件绑定传参需据参数固定性、是否需原生event及修饰符控制来选择:模板直传适用于固定值;需event时须显式写$event;.stop用于阻止冒泡;.self实现仅自身触发;.capture.stop用于捕获阶段拦截。
Vue事件绑定传参很灵活,关键看参数是否固定、是否需要原生事件对象,以及是否要配合修饰符做行为控制。阻止冒泡不是“加个.stop就行”,得结合场景选对方式。
最常用也最直观的方式,把参数写在事件绑定里:
@click="handleClick('确认删除')" —— 字符串、数字、布尔值都能直接传@click="handleClick(id, 'edit', true)"
$event
当你要读取点击位置、判断点击的是哪个子元素,或想手动调用 stopPropagation(),就得把 $event 显式传进去:
@click="handleClick($event, 'submit')"handleClick(event, action)
target、clientX 等属性父容器和子按钮都有 click 事件时,点按钮不希望触发父级逻辑,加 .stop 就行:
立即学习“前端免费学习笔记(深入)”;
<div @click="closePanel"><button @click.stop="confirmDelete">确定</button></div>@click.stop.prevent 是先阻止冒泡再阻止默认行为有些交互要求只在元素自身区域点击才触发,比如点击弹窗背景关闭,但点里面的内容不关:
<div class="modal" @click.self="hideModal"><div class="content">正文</div></div>.content 不会触发 hideModal,因为事件是从子元素冒泡上来的.modal 的 padding 或背景区域才会触发,天然适配“点击外部关闭”需求极少数情况,父组件需要在事件到达子组件前就拦截(比如全局快捷键监听),可用 .capture:
<div @click.capture.stop="handleGlobalClick"><button @click="handleBtn">按钮</button></div>handleGlobalClick 在捕获阶段立即执行,并被 .stop 阻断后续传播,handleBtn 根本不会触发