vue——bus总线
参考:vue用公共组件页面传值_Vue 解决兄弟组件之间传值问题_funny 灵魂的博客-CSDN博客
vue Bus总线 - fanlinqiang - 博客园 (cnblogs.com)
vue.js之路(4)——vue2.0s中eventBus实现兄弟组件通信_YuuyaRin的博客-CSDN博客
vue中使用$bus - 古墩古墩 - 博客园 (cnblogs.com)
使用场景:非父子组件之间的通信,当然也可以使用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);