中央事件总线插件 vue-bus

    xiaoxiao2022-07-02  99

    bus作为一个简单的组件传递事件,用于解决跨级和兄弟组件通信的问题。 vue-bus 插件像vue-router和Vuex一样,给Vue添加一个属性$bus,并代理 e m i t 、 emit、 emiton、$off三个方法。

    vue-bus.js
    const install = function (Vue) { const Bus = new Vue({ methods: { emit (event, ...args) { this.$emit(event, ...args); }, on (event, callback) { this.$on(event, callback) }, off (event, callback) { this.$off(event, callback); } } }); Vue.prototype.$bus = Bus; }; export default install;
    语法提示:
    emit(event, ...args)

    中的…args 是函数参数的解构,因为不知道组件会传递多少个参数,使用…args 可以把从当前参数(这里是第二个)到最后的参数都获取到。

    Counter.vue组件
    <template> <div> {{ number }} <button @click="handleAddRandom">随机增加</button> </div> </template> <script> export default { props: { number: { type: Number } }, methods: { handleAddRandom () { const num = Math.floor(Math.random () * 100 +1); this.$bus.emit('add', num) } } }; </script> <style scoped></style>
    main.js使用插件
    import VueBus from './pages/VueBus/vue-bus'; Vue.use(VueBus);
    在index.vue使用Counter组件
    <template> <div> 随机增加: <Counter :number="number"></Counter> </div> </template> <script> import Counter from '../pages/vueBus/Counter' export default { components: { Counter }, created () { this.$bus.on('add', num => { this.number += num; }) }, };

    使用以上方式解决了跨组件通信的问题,而且通过插件的形式使用后,所有的组件都可以直接用 $bus,无需每个组件都导入bus组件。

    注意

    1、$bus.on 应该在 created 钩子内使用,如果在 mounted 使用,他可能接收不到其他组件来自 created 钩子内发出的事件;

    2、使用了 b u s . o n , 在 b e f o r e D e s t o r y 狗 子 里 应 该 使 用 bus.on,在beforeDestory狗子里应该使用 bus.onbeforeDestory使bus.off解除,因为组件销毁后,没必要把监听的句柄存在vue-bus里了,所以index.vue中应该再加入

    beforeDestory () { this.$bus.off('add', this.handleAddRandom) }
    最新回复(0)