在实际业务中,存在很多非父子组件的信息交互需求,该类需求可以通过事件总线的方法进行解决.

在Vue2.x中,推荐使用一个空的Vue实例作为中央事件总线,也就是一个中介,子组件通过发起事件的方式向中介传递信息,父组件通过事件监听的方式向中介获取信息,这跟实际生活中的通过中介买卖二手房产的情况是一致的,通过此类方法,Vue巧妙地解决了非父子组件信息交互的问题。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<script src="../lib/vue.js"></script>
</head>

<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", "来自组件component-a的内容");
}
}
});
var app = new Vue({
el: "#app",
data: {
message: ""
},
mounted: function() {
var _this = this;
bus.$on("on-message", function(msg) {
_this.message = msg;
});
},
methods: {}
});
</script>
</body>
</html>

以上代码中的bus即为中介实例,子组件componet-a通过触发事件on-message将信息传递给中介实例bus,app页面通过中介实例的mounted钩子函数监听on-message事件获得信息进行相关处理。