总结: 非父子组件传值的步骤:
1,在全局作用域下创建一个空的vue对象, 作为总线bus
var bus = new Vue();
2, 在接收数据的组件初始化函数中使用bus.$on监听自定义事件
bus.$on(“myevent”, data=>{ this.name = data })
3, 在发送数据的组件中, 使用bus.$emit发射/触发自定义事件,把数据发出去
bus.$emit(“myevent”, e.target.value)
注意: 第二步监听必须在第三步发射之前执行, 否则借不到数据, 如
在created中bus.$emit, 在mounted中bus.$on则肯定接不到数据
在created中bus.$emit, 在created中bus.$on则不一定接到数据
<body>
<script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
<div id='myApp'>
组件1: <my-com1></my-com1> <hr>
组件2: <my-com2></my-com2>
</div>
<script>
// 1,在全局作用域下创建一个空的vue对象, 作为总线bus, 相当于一个桥梁连接两个不同的组件, bus在任意组件中都可以调用
var bus = new Vue();
Vue.component('myCom1', {
template: '<div><input @input="send"></div>',
methods:{
send(e){
// 3,在发送数据的组件中, 使用bus.$emit发射/触发自定义事件,把数据发出去
bus.$emit("myevent", e.target.value)
}
}
})
Vue.component('myCom2', {
template: '<div><h1>{{name}}</h1></div>',
data(){ return {name: ""} },
created() {
// 2, 在接收数据的组件初始化函数中使用bus.$on监听自定义事件, 在事件函数中接收数据
bus.$on("myevent", data=>{
// 注意用箭头函数,否则this指向bus
this.name = data
})
},
})
new Vue({
el: '#myApp'
})
</script>
</body>