問題:解決兄弟組件通信的問題,當然你也可以選擇vuex
首先三個組件main.vue, child1.vue, child2,vue
注意:注冊的總線事件要在組件銷毀時卸載,否則會多次掛載,造成觸發一次但多個響應的情況
方法一:使用一個空的Vue實例(bus.js)作為中央事件總線。
bus.js import Vue from 'vue'; const bus = new Vue(); export default bus;
main.vue <template> <div> <child1></child1> <child2></child2 </div> </template> <script> export default { name: 'TestBaiDu', components: { child1: () => import("@/components/child1"), child2: () => import("@/components/child2") } } </script>
child1.vue <template> <div> 這是一個A組件 <el-button type="primary" @click="clickEve">點擊</el-button> </div> </template> <script> import bus from './bus' export default { data () { return {} }, methods: { clickEve () { bus.$emit('getMessage', 'qqqq') } } } </script>
child2.vue <template> <div> 這是一個B組件 </div> </template> <script> import bus from './bus' export default { data () { return {} },
methods:{
showMsg (msg) {
console.log('msg', msg)
}
}, created () { bus.$on('getMessage', this.showMsg )
},
beforDestory () {
this.$off('getMessage', this.showMsg)
}
}
</script>
方法二:把bus定義在vue的prototype上,在全局都可以使用
main.js中加入如下代碼
const bus = new Vue()
Vue.prototype.$bus = bus
這樣我們就不需要再自己寫bus.js引入了,就可以直接再組建中使用
this.$bus.on(),this.$bus.$emit(),this.$bus.$off()
方法三:使用插件vue-bus
安裝 npm install vue-bus --save
main.js中引入
import VueBus from 'vue-bus';//中央事件總線
Vue.use(VueBus)
這樣我們就不需要再自己寫bus.js引入了,就可以直接再組建中使用
this.$bus.on(),this.$bus.$emit(),this.$bus.$off()