我有
<component-one></component-one>
<component-two></component-two>
<component-three></component-three>
组件two
包含组件three
。
目前emit
<component-one>
中的<component-three>
事件必须在<component-one>
中被捕获。
在this.$bus.$emit('setSecondBanner', finalBanner);
中我像这样点击事件:
<component-three>
然后在mounted() {
this.$bus.$on('setSecondBanner', (banner) => {
alert('Caught');
this.banner = banner;
});
},
我抓住它:
caught
但事件永远不会是let eventBus = new Vue();
Object.defineProperties(Vue.prototype, {
$bus: {
get: () => { return eventBus; }
}
});
!
我像这样定义总线(在我的core.js中):
vue-dev-tools
这里有什么问题?当我检查function.php
时,我可以看到该事件已被解雇!
答案 0 :(得分:2)
这是vue1的工作示例。
Object.defineProperty(Vue.prototype, '$bus', {
get() {
return this.$root.bus;
}
});
Vue.component('third', {
template: `<div> Third : {{ data }} </div>`,
props:['data']
});
Vue.component('second', {
template: `<div>Second component <third :data="data"></third></div>`,
ready() {
this.$bus.$on('setSecondBanner', (event) => {
this.data = event.data;
});
},
data() {
return {
data: 'Defautl value in second'
}
}
});
Vue.component('first', {
template: `<div>{{ data }}</div>`,
ready() {
setInterval(() => {
this.$bus.$emit('setSecondBanner', {
data: 'Bus sending some data : '+new Date(),
});
}, 1000);
},
data() {
return {
data: 'Defautl value in first'
}
}
});
var bus = new Vue({});
new Vue({
el: '#app',
data: {
bus: bus
}
});
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.28/vue.js"></script>
<div id="app">
<second></second>
<first></first>
</div>
&#13;
答案 1 :(得分:1)
您是否尝试在created
而不是mounted
注册听众?
另外,为什么要使用defineProperties
来定义总线,而不仅仅是:
Vue.prototype.$bus = new Vue();