-
父组件向子组件通信是通过
props
,子组件向父组件通信是通过$emit
触发一个事件。如果是两个非父子组件,我们再用以上方法逐层通信,就会显得复杂。我们就需要一个总线bus
来帮我们完成这件事。例如:1
Vue.prototype.bus = new Vue()
-
把一个vue实例赋值到
Vue.prototype.bus
,当调用this.bus
的时候,可以使用vue实例的所有特性。利用这一点,就可以轻松完成组件的通信。 -
现在完成一个需求,有两个不同内容的组件,当点击任何一个组件时,组件的内容都变为被点击组件的内容。
-
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<html lang="en">
<head>
<meta charset="UTF-8">
<title>非父子组件通信</title>
<script src="http://vuejs.org/js/vue.js"></script>
</head>
<body>
<div id="root">
<child content="Hello"></child>
<child content="World"></child>
</div>
<script>
Vue.prototype.bus = new Vue()
Vue.component('child', {
data: function () {
return {
selfContent: this.content
}
},//子组件不能直接修改props的值
props: {
content: String
},
methods: {
handleClick: function() {
this.bus.$emit('change', this.selfContent)
}
},
mounted: function() {
this.bus.$on('change', (message) =>{
this.selfContent = message
})
//箭头函数不会改变this的指向
}
})
var vm = new Vue({
el: '#root'
})
</script>
</body>
</html>