Vue全局事件总线

152 阅读1分钟

介绍:

一种组件间通信的方式,适用于任意组件间通信。

步骤

1.安装全局事件总线:

main.js

// 创建vm
new Vue({
    el: '#app',
    render: h => h(App),
    beforeCreate(){
        Vue.prototype.$bus = this      // 安装全局事件总线,$bus就是当前应用的vm
    }
})

2.使用事件总线

①接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。

举例代码(School组件接受数据):

School.vue

<template>
    <div class="school">
        <h2>学校名称:{{ name }}</h2>
        <h2>学校地址:{{ address }}</h2>
    </div>
</template>

<script>
export default {
    name: 'School',
    data() {
        return {
            name: '尚硅谷',
            address: '北京',
        }
    },
    mounted() {
        // console.log('School', this.x);
          this.$bus.$on('hello',((data)=>{
            console.log('我是School组件,收到了数据',data);
        }))
    },
    beforeDestroy() {
        this.$bus.$off('hello')
    },
}
</script>

②提供数据:this.$bus.$emit('xxxx',数据)

举例代码(Student组件传递数据):

Student.vue

<template>
    <div class="student">
        <h2>学生姓名:{{ name }}</h2>
        <h2>学校性别:{{ sex }}</h2>
        <button @click="sendStudentName">把学生名给School组件</button>
    </div>
</template>

<script>
export default {
    name: 'Student',
    data() {
        return {
            name: '张三',
            sex: '男',
        }
    },
    mounted() {
        // console.log('Student', this.x);
    },
    methods: {
        sendStudentName() {
            this.$bus.$emit('hello',666)
        }
    },
}
</script>

注意:

最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。

beforeDestroy() {
        this.$bus.$off('hello')
    },