# Vue中常用的修饰符有哪些 ## 一、修饰符概述 在Vue.js中,修饰符(Modifiers)是以点(.)指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。修饰符可以串联使用,使开发者能够更精确地控制指令的行为。 修饰符的主要特点: - 通过后缀形式实现功能扩展 - 可多个串联使用(如 `@click.stop.prevent`) - 提供声明式的DOM操作解决方案 - 减少模板中的JavaScript代码量 ## 二、事件修饰符 ### 1. 常用事件修饰符 | 修饰符 | 作用 | 等效原生JS实现 | |-----------|------------------------------|--------------------------| | `.stop` | 阻止事件冒泡 | `event.stopPropagation()`| | `.prevent`| 阻止默认事件 | `event.preventDefault()` | | `.capture`| 使用事件捕获模式 | `addEventListener(..., true)`| | `.self` | 仅当事件从元素本身触发时执行 | `if(event.target !== event.currentTarget) return`| | `.once` | 事件只触发一次 | 手动移除事件监听 | | `.passive`| 提升滚动性能(尤其移动端) | `addEventListener(..., {passive: true})`| ### 2. 代码示例 ```html <!-- 阻止单击事件继续传播 --> <button @click.stop="doThis"></button> <!-- 提交事件不再重载页面 --> <form @submit.prevent="onSubmit"></form> <!-- 修饰符可以串联 --> <a @click.stop.prevent="doThat"></a> <!-- 只有修饰符 --> <form @submit.prevent></form> <!-- 滚动事件的默认行为将会立即触发 --> <div @scroll.passive="onScroll">...</div>
.passive
与.prevent
不能共用:
.passive
已经向浏览器表明你不想阻止事件的默认行为,如果同时使用会导致.prevent
被忽略。
.capture
的嵌套顺序:
对于嵌套元素的事件处理,使用捕获模式会从外向内触发。
<div @click.capture="outer"> <div @click="inner"></div> </div> <!-- 点击inner时,先触发outer再触发inner -->
Vue为常用按键提供了别名:
修饰符 | 对应按键码 |
---|---|
.enter | 13 |
.tab | 9 |
.delete | 46 |
.esc | 27 |
.space | 32 |
.up | 38 |
.down | 40 |
.left | 37 |
.right | 39 |
// 全局配置 Vue.config.keyCodes = { f1: 112, mediaPlayPause: 179 }
使用示例:
<input @keyup.media-play-pause="onMediaPlayPause">
修饰符 | 说明 |
---|---|
.ctrl | Ctrl键 |
.alt | Alt键 |
.shift | Shift键 |
.meta | Windows键或Command键 |
.exact | 精确控制系统修饰符组合 |
<!-- Alt + C --> <input @keyup.alt.67="clear"> <!-- Ctrl + Click --> <div @click.ctrl="doSomething">按住Ctrl点击我</div> <!-- 有且只有Ctrl被按下时触发 --> <button @click.ctrl.exact="onCtrlClick">精确控制</button>
修饰符 | 作用 | 等效JS实现 |
---|---|---|
.lazy | 转为change事件同步 | input.addEventListener('change', ...) |
.number | 输入值转为数字类型 | parseFloat(val) |
.trim | 自动过滤首尾空白字符 | val.trim() |
<!-- 默认行为(input事件触发) --> <input v-model="msg" type="text"> <!-- 使用.lazy(change事件触发) --> <input v-model.lazy="msg" type="text"> <!-- 自动转为数字 --> <input v-model.number="age" type="number"> <!-- 去除首尾空格 --> <input v-model.trim="username">
.number
的边界情况:
.trim
的应用场景:
修饰符 | 触发条件 |
---|---|
.left | 鼠标左键点击 |
.right | 鼠标右键点击 |
.middle | 鼠标中键点击 |
<div @mousedown.right="rightClick">右键点击此处</div>
Vue.directive('custom-modifier', { bind(el, binding) { if (binding.modifiers.uppercase) { el.value = el.value.toUpperCase() } } })
使用方式:
<input v-custom-modifier.uppercase>
实现一个自动聚焦并全选文本的修饰符:
Vue.directive('select', { inserted(el, binding) { if (binding.modifiers.focus) { el.focus() } if (binding.modifiers.all) { el.select() } } })
<input v-select.focus.all>
Vue的修饰符处理主要发生在编译阶段:
模板编译阶段:
将修饰符解析为AST节点的属性
代码生成阶段:
根据修饰符生成对应的JavaScript代码
示例转换:
<!-- 原始模板 --> <button @click.stop.prevent="submit"></button> <!-- 生成代码 --> function genHandler() { return function($event) { $event.stopPropagation(); $event.preventDefault(); submit($event) } }
性能优化:
.passive
.lazy
减少更新频率可维护性:
常见误区:
.self
导致事件处理不符合预期.stop
和.prevent
的使用场景Vue的修饰符系统提供了一种声明式处理DOM事件的优雅方案,合理使用可以:
建议开发者根据实际场景灵活组合使用,在简化代码的同时保证功能的正确实现。 “`
注:本文实际约2800字,完整3000字版本可扩展以下内容: 1. 更多自定义修饰符案例 2. 与React事件处理的对比 3. 修饰符在Vue3中的变化 4. 各修饰符的浏览器兼容性说明 5. 性能测试数据对比
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。