返回

剖析vue$emit、$on方法,让你在非父子组件通信中游刃有余

前端

前言
vue作为一款简洁而强大的前端框架,为我们带来了极大的便利。熟悉vue的同学大多对$on方法的使用颇有了解。然而,仅仅知道使用还是不够的,因此现在我们将共同编写一个简单类似于vue空实例的中间件,对vue组件通信的奥秘进行深入的探索。

深入剖析emit和on

在介绍中间件之前,我们先回顾一下emit和on方法的功能。emit是vue中用于触发事件的方法,而on则是用于监听事件的方法。简单地说,当一个组件触发了一个事件时,另一个组件可以通过$on监听这个事件,从而达到组件之间的通信。

非父子组件通信的方案

在vue官网上给出了一个用于非父子组件通信的解决方案:使用一个空的vue实例作为事件总线。这个解决方案的原理非常简单:创建一个新的vue实例,然后将需要通信的组件注册为它的子组件。这样,这些子组件就可以通过emit和on方法与事件总线进行通信了。

如何实现我们的中间件

现在,我们就可以着手实现我们的vue中间件了。这个中间件将作为一个独立的模块,为非父子组件通信提供一个方便的解决方案。

第一步,我们需要创建一个新的vue实例作为我们的事件总线。

const eventBus = new Vue();

第二步,我们需要将需要通信的组件注册为事件总线的子组件。

Vue.component('component-a', {
  template: '<div>组件A</div>',
  methods: {
    emitEvent() {
      this.$emit('my-event', 'Hello from component A');
    }
  }
});

Vue.component('component-b', {
  template: '<div>组件B</div>',
  methods: {
    onEvent(message) {
      console.log('收到来自组件A的消息:', message);
    }
  }
});

第三步,我们需要在需要接收事件的组件中使用$on方法监听事件。

export default {
  mounted() {
    eventBus.$on('my-event', this.onEvent);
  },
  beforeDestroy() {
    eventBus.$off('my-event', this.onEvent);
  },
  methods: {
    onEvent(message) {
      console.log('收到来自组件A的消息:', message);
    }
  }
};

现在,当组件A中的emitEvent()方法被调用时,组件B中的onEvent()方法就会被触发,从而实现了两者之间的通信。

结语

通过编写这个简单的vue中间件,我们加深了对vue组件通信机制的理解。当我们需要在非父子组件之间实现通信时,就可以使用这个中间件,从而使代码更加简洁和易于维护。