Кроме небольшой опечатки в вашем $on
, неясно, что вы делаете неправильно, поскольку вы не предоставили достаточно контекста, но вот рабочий пример того, что вы пытаетесь сделать (отправить иполучить событие через элемент $root
без создания отдельного экземпляра Vue EventBus).(Многие люди предпочитают передавать сообщения через отдельный экземпляр, но функционально это похоже на $root
.)
Я включил объект полезной нагрузки, чтобы продемонстрировать передачу информации вместе с событием.
Vue.component('sender', {
template: '<span><button @click="send">Sender</button></span>',
methods: {
send() {
console.log("Sending...")
this.$root.$emit('eventName', {
message: "This is a message object sent with the event"
})
}
}
})
Vue.component('receiver', {
template: '<span>Receiver component {{message}}</span>',
data() {return {message: ''}},
mounted() {
this.$root.$on('eventName', (payload) => {
console.log("Received message", payload)
this.message = payload.message
})
}
})
new Vue({
el: '#app'
});
<script src="https://unpkg.com/vue@latest/dist/vue.min.js"></script>
<div id="app">
<sender></sender>
<receiver></receiver>
</div>
Лично я не склонен часто использовать этот паттерн;Я считаю, что лучше обрабатывать межкомпонентную связь от родителя к потомку как подпорки, а от потомка к родителю - как прямые $emit
s (не на $root
).Когда я обнаруживаю, что мне нужно общение между братьями и сестрами, это, как правило, признак того, что я сделал несколько неудачных архитектурных решений или что мое приложение стало достаточно большим, чтобы я мог переключиться на vuex.Сбор всех сообщений о событиях в едином месте, будь то $root
или экземпляр Eventbus, имеет тенденцию усложнять приложение для анализа и отладки.
По крайней мере, вы должны быть очень явными в названии ваших событий, чтобы легче было понять, откуда они берутся;имена событий, такие как «handleClick» или просто «event», быстро становятся таинственными неизвестными.