当前位置:首页 > VUE

简单实现vue事件机制

2026-02-21 11:42:35VUE

Vue 事件机制实现

Vue 的事件机制主要基于发布-订阅模式,可以通过自定义实现一个简化版的事件系统。

简单实现vue事件机制

核心概念

  1. 事件中心(Event Hub):管理所有事件的订阅和发布
  2. $on 方法:订阅事件
  3. $emit 方法:触发事件
  4. $off 方法:取消订阅

基础实现代码

class EventEmitter {
  constructor() {
    this.events = {}
  }

  $on(eventName, callback) {
    if (!this.events[eventName]) {
      this.events[eventName] = []
    }
    this.events[eventName].push(callback)
  }

  $emit(eventName, ...args) {
    const callbacks = this.events[eventName]
    if (callbacks) {
      callbacks.forEach(cb => cb(...args))
    }
  }

  $off(eventName, callback) {
    const callbacks = this.events[eventName]
    if (callbacks) {
      if (callback) {
        this.events[eventName] = callbacks.filter(cb => cb !== callback)
      } else {
        delete this.events[eventName]
      }
    }
  }
}

在 Vue 实例中集成

function initEvents(vm) {
  vm._events = Object.create(null)

  vm.$on = function(event, fn) {
    (vm._events[event] || (vm._events[event] = [])).push(fn)
    return vm
  }

  vm.$once = function(event, fn) {
    function on() {
      vm.$off(event, on)
      fn.apply(vm, arguments)
    }
    vm.$on(event, on)
    return vm
  }

  vm.$off = function(event, fn) {
    if (!arguments.length) {
      vm._events = Object.create(null)
      return vm
    }

    const cbs = vm._events[event]
    if (!cbs) return vm

    if (!fn) {
      vm._events[event] = null
      return vm
    }

    vm._events[event] = cbs.filter(cb => cb !== fn)
    return vm
  }

  vm.$emit = function(event) {
    const cbs = vm._events[event]
    if (cbs) {
      const args = Array.prototype.slice.call(arguments, 1)
      cbs.forEach(cb => cb.apply(vm, args))
    }
    return vm
  }
}

父子组件通信实现

// 父组件
const parent = new Vue()
parent.$on('child-event', (msg) => {
  console.log('收到子组件消息:', msg)
})

// 子组件
const child = new Vue()
child.$emit('child-event', 'Hello from child')

全局事件总线

Vue.prototype.$bus = new Vue()

// 组件A
this.$bus.$on('some-event', (data) => {
  console.log(data)
})

// 组件B
this.$bus.$emit('some-event', 'message')

注意事项

  1. 事件名称最好使用kebab-case命名规范
  2. 及时在组件销毁时移除事件监听
  3. 避免滥用全局事件总线,优先考虑props和自定义事件
  4. 复杂场景考虑使用Vuex状态管理

这种实现方式模拟了Vue核心的事件系统原理,实际Vue源码中事件处理更加复杂,包含更多边界情况处理。

标签: 机制事件
分享给朋友:

相关文章

vue实现自定义事件

vue实现自定义事件

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

vue实现事件绑定

vue实现事件绑定

Vue 事件绑定实现方法 Vue 提供了多种方式实现事件绑定,以下是常用方法: v-on 指令 使用 v-on 指令绑定事件监听器,语法为 v-on:event="handler" 或简写为 @ev…

vue实现点击单选事件

vue实现点击单选事件

Vue 实现点击单选事件的方法 在 Vue 中实现单选功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 绑定一个变量,可以轻松实现单选功能…

Vue事件传递实现原理

Vue事件传递实现原理

Vue 事件传递的实现原理 Vue 的事件传递主要通过 $emit 和 $on 方法实现,基于发布-订阅模式。子组件通过 $emit 触发事件,父组件通过 v-on 或 @ 监听事件,从而实现父子组件…

react如何模拟事件

react如何模拟事件

模拟事件的方法 在React中模拟事件通常用于测试或触发特定交互行为。以下是几种常见方法: 使用fireEvent(React Testing Library) import { render,…

react中如何用回车事件

react中如何用回车事件

在React中处理回车事件 在React中,可以通过监听键盘事件来捕获回车键(Enter key)的按下动作。以下是几种常见场景的实现方法: 监听输入框的回车事件 在输入框中按下回车时触发特…