上一篇讲了父子组件的通讯,那么非父子组件间如何通讯呢?在vue.js 2.x中,用一个空的Vue实例做为中央事件总线与两个跨级组件进行通讯,在通讯的过程当中两个跨级组件互不联系。vue
前面大概介绍了中央事件总线的过程,具体如何进行看个栗子。bash
<body>
<div id="app">
{{ message }}
<component-a></component-a>
</div>
<script>
var bus = new Vue();
Vue.component('component-a',{
template: '<button @click="handleEvent">传递-事件</button>',
methods: {
handleEvent:function () {
bus.$emit('on-message','来自组件commponent-a的内容');
}
}
});
var app = new Vue({
el: '#app',
data: {
message: ''
},
mounted: function (){
var _this = this;
//在实例初始化时,监听来自bus实例的事件
bus.$on('on-message',function (msg) {
_this.message = msg;
}) ;
}
})
</script>
</body>
复制代码
结果如图所示:app
2.关于mounted这个钩子,咱们知道el挂载到实例后调用,通常业务逻辑会从这里开始。函数
3.当el挂载app后,在mounted的函数里面监听来自bus的on-message事件,因此当on-message事件传到bus实例上后,就会执行匿名函数function,给app中data里的message赋值。 (msg){}。页面中再经过插值表达式将数据message显示出来。this
在vue.js 2.x中,用一个空的Vue实例bus做为中央事件总线,bus实例也能够扩展,好比添加methods,data,computed等选项。固然还有经过父链和子组件索引也能够实现组件间的通讯。spa