大家或许都听说EventBus,或者说或多或少都了解过,他可以在任何两个组件中进行传值,不局限于父子、祖孙或是兄弟组件,也可以说他是一种发布——订阅的设计模式。

我将使用拆分为五个步骤:创建、引入、监听、递交、销毁

1、创建

// 创建一个EventBus.js文件

// 引入

import Vue from 'vue' 

// 创建实例

const EventBus = new Vue() 

// 导出

export default EventBus

2、 引入 有两种方法

1. 使用import引入

import EventBus from '../EventBus'

2.使用Vue原型链引入

// 在 src 的 main.js 中,加上以下代码

// 引入第一步创建好的 EventBus

import EventBus from './EventBus'

// 这个方式可以在任何组件里直接用 this.$EventBus 调用

Vue.prototype.$EventBus = EventBus

// 也可以直接这样使用,不需要第一步的创建

 import Vue from 'vue'

Vue.prototype.$EventBus = new Vue()

3、监听

要使用监听方法,只要调用EventBus下的$on方法 (使用Vue原型链引入

(使用Vue原型链引入

<template>

    <div>

         <h3>页面A</h3>

         <router-link to="/b"> 跳转B页面 </router-link>

    </div>

</template>

<script>

export default {

     created () {

         console.log('----A页面监听事件----')

        // 使用Vue原型链引入

        this.$EventBus.$on('getNum', (num) => {

            console.log('num', num)

        })

     }

}

</script>

4、 递交  

只要调用EventBus下的$emit方法  

使用Vue原型链引入

<template>

     <div>

         <h3>B页面</h3>

         <router-link to="/a"> 跳转A页面 </router-link>

     </div>

</template>

<script>

export default {

    created () {

         console.log('----B页面递交事件----')

         const num = 2

         // 使用Vue原型链引入

         this.$EventBus.$emit('getNum', num)

    }

}

</script>

5、销毁

如果不对监听事件销毁,会导致了内存泄露

应该在调用 方法()页面的生命周期中添加$off()

// a.vue 添加$off方法,防止内存泄露

beforeDestroy () {

     console.log('----A页面销毁监听事件----')

     this.$EventBus.$off('getNum')

}

 完整代码

a页面

<template>

   <div>

      <h3>页面A</h3>

        <router-link to="/b"> 跳转B页面 </router-link>

    </div>

</template>

<script>

export default {

    created () {

     console.log('----A页面监听事件----')

       // 使用Vue原型链引入

      this.$EventBus.$on('getNum', (num) => {

          console.log('num', num)

      })

   },

   beforeDestroy () {

      console.log('----A页面销毁监听事件----')

      // 使用Vue原型链引入

      this.$EventBus.$off('getNum')

   }

}

</script>

b页面

<template>

      <div>

       <h3>B页面</h3>

        <router-link to="/a"> 跳转A页面 </router-link>

      </div>

</template>

<script>

export default {

     created () {

        console.log('----B页面递交事件----')

        const num = 2

        // 使用Vue原型链引入

        this.$EventBus.$emit('getNum', num)

     }

}

</script> 

创建eventBus->引入同一个实例->绑定(订阅)监听事件->递交(发布)事件->销毁监听事件 

Logo

前往低代码交流专区

更多推荐