当前位置:首页 > VUE

vue事件实现原理

2026-02-17 14:12:13VUE

Vue 事件实现原理

Vue 的事件系统基于发布-订阅模式,通过 $on$emit$off 等方法实现组件间通信。其核心原理可以分为以下几个部分:

事件注册与存储

Vue 实例内部通过 _events 对象存储事件监听器。当调用 $on 方法时,会将事件名作为键,监听器函数作为值存入 _events 对象。如果是多个监听器,则以数组形式存储。

// 伪代码示例
Vue.prototype.$on = function (event, fn) {
  const vm = this
  ;(vm._events[event] || (vm._events[event] = [])).push(fn)
  return vm
}

事件触发

调用 $emit 方法时,会根据事件名从 _events 中取出对应的监听器函数列表,依次执行。支持传递参数,这些参数会传递给监听器函数。

Vue.prototype.$emit = function (event, ...args) {
  const vm = this
  let cbs = vm._events[event]
  if (cbs) {
    cbs.forEach(fn => fn.apply(vm, args))
  }
  return vm
}

事件移除

$off 方法用于移除事件监听器。可以移除指定事件的某个监听器、所有监听器,或移除所有事件的所有监听器。

Vue.prototype.$off = function (event, fn) {
  const vm = this
  if (!arguments.length) {
    vm._events = Object.create(null)
    return vm
  }
  if (!fn) {
    vm._events[event] = null
    return vm
  }
  const cbs = vm._events[event]
  if (cbs) {
    vm._events[event] = cbs.filter(cb => cb !== fn)
  }
  return vm
}

自定义事件与原生事件

Vue 还区分自定义事件和原生 DOM 事件:

  • 自定义事件通过 $emit$on 实现组件间通信。
  • 原生 DOM 事件通过 v-on 指令绑定,底层调用 addEventListener

事件修饰符

Vue 提供的事件修饰符(如 .stop.prevent)在编译阶段会被解析为对应的原生 DOM 操作。例如:

  • .stop 会调用 event.stopPropagation()
  • .prevent 会调用 event.preventDefault()

总结

Vue 的事件系统通过 _events 对象管理监听器,利用发布-订阅模式实现高效的事件通信。其设计兼顾了灵活性和性能,同时通过修饰符简化了原生事件的处理。

vue事件实现原理

标签: 原理事件
分享给朋友:

相关文章

vue异步组建实现原理

vue异步组建实现原理

Vue 异步组件实现原理 Vue 的异步组件允许将组件按需加载,通常用于代码分割或延迟加载非关键组件。其核心原理基于 Promise 和动态导入。 基本实现方式 通过 defineAsyncComp…

vue实现自定义事件

vue实现自定义事件

Vue 自定义事件实现方法 在 Vue 中,自定义事件是通过 $emit 方法触发的,父组件通过 v-on 或 @ 监听子组件触发的事件。以下是几种常见的实现方式: 子组件触发事件 在子组件中,使…

vue中样式的实现原理

vue中样式的实现原理

Vue 中样式的实现原理 Vue 的样式处理机制基于其核心的响应式系统和虚拟 DOM 技术,通过编译、作用域隔离和动态绑定实现高效的样式管理。 样式作用域隔离 Vue 的单文件组件(SFC)通过 s…

jquery绑定事件

jquery绑定事件

jQuery 绑定事件的方法 jQuery 提供了多种方式来绑定事件,以下是常见的几种方法: on() 方法 on() 是最推荐的事件绑定方法,支持动态元素和多个事件绑定。 $(selector)…

vue实现全屏事件

vue实现全屏事件

Vue 实现全屏事件的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 Ele…

vue set实现原理

vue set实现原理

Vue.set 的实现原理 Vue.set 是 Vue.js 提供的一个全局 API,用于向响应式对象添加新属性并确保其也是响应式的。其核心原理基于 Vue 的响应式系统实现。 响应式系统基…