当前位置:首页 > VUE

vue事件实现原理

2026-01-16 21:40:02VUE

Vue 事件实现原理

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

事件注册与存储

Vue 实例内部通过 _events 对象存储事件监听器。调用 $on(event, callback) 时,会将回调函数按事件名存入 _events

// 简化版实现
Vue.prototype.$on = function (event, fn) {
  (this._events[event] || (this._events[event] = [])).push(fn);
};

事件触发

$emit(event, ...args) 会从 _events 中查找对应事件名的回调数组,并依次执行:

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

事件移除

$off(event, callback) 会从 _events 中移除指定事件的回调:

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

自定义事件与原生事件

  • 自定义事件:通过 $emit$on 实现父子组件通信,例如 v-on:my-event 会被编译为 $on('my-event')
  • 原生 DOM 事件:通过 v-on@ 绑定到模板时,Vue 会调用原生 addEventListener,并在组件销毁时自动解绑。

事件修饰符原理

例如 .stop.prevent 等修饰符会在编译阶段转换为对应的原生事件操作:

vue事件实现原理

// .stop 修饰符的实现逻辑
if (event.stopPropagation) event.stopPropagation();

性能优化

Vue 通过事件缓存机制(如 $once)和自动解绑(组件销毁时调用 $off)避免内存泄漏。

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

相关文章

jquery事件

jquery事件

jQuery 事件基础 jQuery 提供了一套简化的事件处理机制,允许开发者通过简洁的语法绑定、触发和管理事件。核心方法包括 on()、off()、trigger() 等,支持常见事件(如点击、悬停…

vue extend实现原理

vue extend实现原理

Vue.extend 的实现原理 Vue.extend 是 Vue.js 中用于创建子类构造函数的全局方法,其核心原理基于 JavaScript 的原型继承机制。以下是其关键实现逻辑: 原型继承与构…

jquery触发事件

jquery触发事件

jQuery 触发事件的方法 jQuery 提供了多种方法来触发事件,包括直接触发、自定义事件以及模拟用户行为。以下是几种常见的方法: trigger() 方法 trigger() 方法用于触发指定…

vue eventbus实现原理

vue eventbus实现原理

Vue EventBus 的实现原理 EventBus 是 Vue 中用于跨组件通信的一种模式,通常基于 Vue 的实例事件系统实现。其核心原理是通过一个独立的 Vue 实例作为事件中心,实现组件间的…

vue分页实现原理

vue分页实现原理

Vue 分页实现原理 Vue 分页的核心原理是通过计算当前页的数据范围,动态渲染数据列表并控制分页组件的交互。以下是关键实现步骤: 数据分片计算 分页需要根据当前页码和每页条数截取数据。假设原始数据…

jquery添加事件

jquery添加事件

jQuery 添加事件的方法 jQuery 提供了多种方法来为元素添加事件监听。以下是一些常用的方式: 使用 .on() 方法 .on() 是 jQuery 中推荐的事件绑定方法,支持直接绑定和委托…