vue2(8月25日)(建议使用)全局事件总线+消息订阅与发布------作用:任意组件之间通信(传递数据)

64 阅读2分钟

全局事件总线

作用:用于任意组件间的通信(传递数据)

首先创建出一个所有组件都能看到的bus
在new Vue时  利用生命周期函数 beforCreate给Vue的原型上添加一个全局事件总线

例子:
//main.js里
new Vue({
    beforeCreate(){
        vue.prototype.<全局事件总线名> = this(this指向vm)
    }
})

在想要接受数据的组件上,绑定自定义事件,事件的回调留在A组件自身
methods(){
    回调函数(){
    }
},
mounted(){
    this.<全局事件总线名>.$on('自定义事件名',调用回调函数)
}

在提供数据的组件通过:this.<全局事件总线>.$emit('事件名',数据)提供数据

!!最好在beforeDestroy生命周期中 使用$off去解绑使用的自定义事件

消息订阅与发布

    原生js里面没有办法轻松的实现订阅与发布
    所以在vue里面一般借助第三方库来实现这个功能
    订阅:(需要收到数据的组件)提供一个联系方式
    发布:(发送数据的组件) 带着数据
    
    库有很多  下面例子用的是 pubsub-js库做例子
    
    首先在终端 npm i pubsub-js  安装pubsub-js库
    那个组件需要订阅消息就在那个组件里面引入
    引入:import pubsub from 'pubsub-js'
    在引入的组件当中的mounted挂载生命周期函数里面订阅消息
    mounted(){
        //页面挂载完后订阅消息
        subscribe 是引入的pubsub-js中的API  订阅消息时使用(第一个参数为消息名-联系方式,第二个参数是回调函数使用带回来的数据)
       this.pubid = pubsub.subscribe('消息名',回调函数(第一个形参是联系方式,第二个形参为数据))
    }
    发布数据的组件也需要引入pubsub-js库
    例子:
    methods(){
        函数名(){
            pubsub.publish('订阅消息给的联系方式',传递过去的数据)
        }
    }
       
    当然别忘了取消订阅
    beforeDestroy(){
        pub.unsubscribe(this.pubid)//this.pubid是在订阅消息时赋值给当前组件vc身上的一个变量
    }