返回顶部

vue——bus总线

参考:vue用公共组件页面传值_Vue 解决兄弟组件之间传值问题_funny 灵魂的博客-CSDN博客

  vue Bus总线 - fanlinqiang - 博客园 (cnblogs.com)

  vue.js之路(4)——vue2.0s中eventBus实现兄弟组件通信_YuuyaRin的博客-CSDN博客

  vue中使用$bus - 古墩古墩 - 博客园 (cnblogs.com)

  浅谈Vue.use - SegmentFault 思否

 

 

使用场景:非父子组件之间的通信,当然也可以使用vuex,但小型项目可以考虑使用bus

 

使用方式:

 

方式一. 组件调用时先引入

但这种引入方式,经过webpack打包后可能会出现Bus局部作用域的情况,即引用的是两个不同的Bus,导致不能正常通信

 

Bus.js:

import Vue from 'vue'
const Bus = new Vue()
export default Bus

组件1:

import Bus from 'util/Bus'

export default {
    data() {
        return {
            .........
            }
      },
    created() {
    /* 
     * 必须要在 vue 的created钩子函数中来触发这个bus,在页面还没加载的时候先触发它然后拿到数据
     * 在created中执行,可以避免很多坑, 例如触发bus无法拿到数据等问题
     */
       Bus.$on('log', val=> { 
          console.log(val)
        });    
    },  
    beforeDestoyed() {
       Bus.$off('log'); // 销毁bus方法'log',是避免方法“冗余”。若不清除这个方法,将会出现多个bus触发时,每次都会将这个方法注入在这个vue的生命周期中
    }   
}             

组件2:

import Bus from './Bus'

export default {
    data() {
        return {
            .........
            }
      },
  methods: {
        ....
        Bus.$emit('log', 120)
    },

  } 

 

方式二. 直接在vue实例上绑定

main.js:

Vue.prototype.$bus = new Vue();

组件1:

created() {
    this.$bus.$on('log', val => {
      console.log(val);
    });
  },
beforeDestroyed() {
    this.$bus.$off('log');
  }

组件2:

this.$bus.$emit('log', 120);

 

方式三. 插件化

Bus.js:

import Bus from 'vue';
let install = function(Vue) {
  Vue.prototype.$bus = new Bus(); 
};

export default { install };

main.js:

import Vue from 'vue';
import Bus from 'util/Bus';
... ...

Vue.use(Bus); // 调用Bus中的install方法
... ...

组件1:

created() {
    this.$bus.$on('log', val => {
      console.log(val);
    });
  },
beforeDestroyed() {
    this.$bus.$off('log');
  }

组件2:

this.$bus.$emit('log', 120);

 

posted @ 2022-01-28 11:32  前端-xyq  阅读(1281)  评论(0编辑  收藏  举报