当前位置:首页 > VUE

简单实现vue事件机制

2026-02-21 11:42:35VUE

简单实现vue事件机制

简单实现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源码中事件处理更加复杂,包含更多边界情况处理。

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

相关文章

jquery触发事件

jquery触发事件

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

vue实现change事件

vue实现change事件

Vue 实现 change 事件的方法 在 Vue 中,可以通过多种方式监听和处理 change 事件,以下是常见的实现方法: 使用 v-on 或 @ 语法监听 change 事件 <tem…

vue computed实现机制

vue computed实现机制

Vue computed 实现机制 Vue 的 computed 属性是基于响应式依赖的缓存机制,其核心实现依赖于 Vue 的响应式系统和依赖收集。 初始化阶段 在 Vue 实例初始化时,compu…

vue实现事件捕获

vue实现事件捕获

Vue 中实现事件捕获的方法 在 Vue 中,默认情况下事件是通过冒泡机制传递的。如果需要实现事件捕获,可以通过以下方式: 使用 .capture 修饰符 Vue 提供了 .capture 事件修饰…

vue如何实现事件委托

vue如何实现事件委托

Vue 中实现事件委托的方法 事件委托是一种利用事件冒泡机制将子元素的事件处理委托给父元素的优化技术。Vue 中可以通过以下几种方式实现: 使用 v-on 和事件修饰符 通过 v-on 指令…

vue响应式实现机制

vue响应式实现机制

Vue 响应式实现机制 Vue 的响应式系统是其核心特性之一,通过数据劫持和依赖收集实现数据变化时自动更新视图。以下是主要实现机制: 数据劫持(Object.defineProperty 或 Pro…