那些关于$event在vue中不得不说的事

$event 只在「模板里的内联表达式」里有效,代表 本次事件携带的原始数据 ------

• 原生事件:浏览器 Event 对象

• 组件自定义事件:子组件 $emit 的第 2+ 个参数

$emit( name, arg1, arg2, ... ) 里的 第 2、3、4... 个参数 都会原封不动地 被 Vue 打包成一个类数组对象 (严格说就是普通参数列表),父组件模板里写 $event 时,拿到的就是这一个列表 ;如果你只关心第一个参数,那 $event 就等价于 arg1

使用场景总览

场景 绑定目标 触发源 $event 内容
1. 原生 DOM 事件 <div @click> <input @input> 浏览器 Event
2. 表单输入 v-model <input v-model> 浏览器 Event
3. 组件自定义事件 <my-cpn @foo> 子组件 $emit('foo', payload) payload
4. 组件 v-model <my-cpn v-model> 子组件 $emit('input', payload) payload
5. 原生事件 .native <my-cpn @click.native> 浏览器 Event

1. 原生 DOM 事件

vue 复制代码
<template>
  <button @click="log">点我</button>
</template>

<script>
export default {
  methods: {
    log (e) {
      console.log('原生事件对象:', e)   // $event 就是 MouseEvent
    }
  }
}
</script>

2.表单输入 v-model

vue 复制代码
<template>
  <!-- 手动拆解 v-model,暴露 $event -->
  <input :value="msg" @input="msg = $event.target.value">
</template>

<script>
export default {
  data () {
    return { msg: '' }
  }
}
</script>

3.组件自定义事件

父组件:CustomParent.vue

vue 复制代码
<template>
  <!-- $event 就是子组件 emit 的 payload -->
  <counter @increment="total += $event"/>
</template>

<script>
import Counter from './Counter.vue'
export default {
  components: { Counter },
  data () { return { total: 0 } }
}
</script>

子组件:Counter.vue

vue 复制代码
<template>
  <button @click="$emit('increment', 2)">+2</button>
</template>

特别注意:Vue 2 的自定义事件($emit)根本就不会自动冒泡 ,所以不存在"第三层还能不能拿到 payload"的问题------事件在第 1 层就被消费了,后面的层级默认收不到

体系 是否冒泡 典型 API 备注
浏览器原生 DOM 事件 ✅ 冒泡 addEventListener.native 点击、键盘、滚动...
Vue 自定义事件系统 ❌ 不冒泡 vm.$emit、组件 @foo 只在父子之间点对点通信
想让"第三层"也能收到,有 3 种正规手段
  1. 逐层向上 $emit
    每一层都 $emit('custom', payload),像接力棒一样传上去。
  2. 中央事件总线 / Vuex
    new Vue()bus 或 Vuex 全局状态,跨 N 层随意通信。
  3. .sync 语法糖 (Vue 2.3+)
    逐层写 :value.sync="val",Vue 会自动帮你每层都转发 update:value
相关推荐
方也_arkling41 分钟前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
毕设源码-朱学姐43 分钟前
【开题答辩全过程】以 基于web教师继续教育系统的设计与实现为例,包含答辩的问题和答案
前端
web打印社区1 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
RFCEO1 小时前
前端编程 课程十三、:CSS核心基础1:CSS选择器
前端·css·css基础选择器详细教程·css类选择器使用方法·css类选择器命名规范·css后代选择器·精准选中嵌套元素
Amumu121382 小时前
Vuex介绍
前端·javascript·vue.js
We་ct2 小时前
LeetCode 54. 螺旋矩阵:两种解法吃透顺时针遍历逻辑
前端·算法·leetcode·矩阵·typescript
2601_949480062 小时前
【无标题】
开发语言·前端·javascript
css趣多多2 小时前
Vue过滤器
前端·javascript·vue.js
理人综艺好会3 小时前
Web学习之用户认证
前端·学习
We་ct3 小时前
LeetCode 36. 有效的数独:Set实现哈希表最优解
前端·算法·leetcode·typescript·散列表