跨组件通信-事件中心

# 反思:

  • 当我们想要实现父子组件之间的通信的时候,是非常方便的。如果是跨组件之间的通信呢?
  • 这篇记录的是中央事件总线的方式实现兄弟,父子,跨组件之间的通信,项目比较大建议使用vuex。
  • 优点:轻量,巧妙,跨组件通信。

# 1.新建一个.js文件,创建eventBus

  • 在eventbus中创建一个vue的空的实例对象,并导出,做为事件中心。
    // eventBus.js
    import Vue from 'vue'
    export default new Vue()        

# 2. 在需要使用事件总线的组件中引入 eventBus.js文件

import EventBus from '../../utils/eventbus'

下面是模拟爷爷组件和孙子组件之间的通信,爷爷组件(father.vue), 孙子组件(grandson.vue)

3. 孙子组件 grandson.vue

<template>
    <el-button type="primary" @click="changeDate">触发爷爷组件上的方法</el-button>
</template>
<script> 
import EventBus from '../../utils/eventbus'
export default {
  methods:{
      changeDate() {
          // 传参
          EventBus.$emit('change', 100);
          // 不传参
          //EventBus.$emit('change');
      } 
 }
}
</script>

TIP

这里我们在孙子组件中每次点击,都会在EventBus中触发这个名为’changeDate’的事件,并将点击事件的参数 100 顺着事件传递出去。当然我们也可以通过 事件对象(event.target)传递事件信息。 接着,我们要在父组件中的created()钩子中调用EventBus监听这个事件,并接收参数使用。

4. 爷爷组件 father.vue

<template>
  <p>money:{{money}}元</p>
</template>
<script> 
import EventBus from '../../utils/eventbus'
export default {
   data() {
     return { money:1}
   },
   created() {
      EventBus.$on('change',(num)=> {
          console.log("这是孙子组件通过EventBus触发的事件")
          this.money += num;
      })
    },
}
</script>

TIP

eventBus的使用还是非常便捷的,也很好理解,找一个中间人负责管理我们的所有事件,通过中间人实现全局的通信。但是如果是中大型项目,通信比较复杂,最好使用vuex。

Last Updated: 12/7/2020, 3:08:32 PM