Вы можете использовать централизованный концентратор для генерации событий (как это предлагается в документах https://vuejs.org/v2/guide/migration.html#dispatch-and-broadcast-replaced), а затем прослушивать и реагировать на эти события внутри ваших дочерних компонентов. Вот быстрое обновление кода, который делает это:
var eventHub = new Vue();
Vue.component('cart', {
template: `<span>{{ items }}</span>`,
data() {
return {
items: 0
}
},
created() {
eventHub.$on('add-item', this.add)
},
methods: {
add() {
alert('add');
this.items++;
}
}
});
new Vue({
el: '#root',
components: ['cart'],
methods: {
addToCart() {
eventHub.$emit('add-item')
}
}
});
Я только начал использовать вю себя, так что я могу ошибаться, но, насколько я знаю, имея ребенка компонента зависит от конкретного родителя является плохой идеей, он заставляет дочерний компонент «соединяться» с этим родителем, чтобы он функционировал и делал его не переносимым. Испускать события из резервной копии дочернего компонента прекрасно, хотя, поскольку это будет просто компонент, позволяющий любому слушающему знать, что что-то произошло. Я предполагаю, что вы могли бы получить доступ к родительскому объекту и событиям, которые он испустил напрямую, используя this.$parent.$on('add-item', this.method)
, но это выглядит грубовато для меня. Возможно, если ваш корневой и дочерний компоненты всегда будут плотно соединены таким образом, this.$parent
будет в порядке. Пример «instatiating a new vue instance» выше, вероятно, является просто еще одним способом сделать это, не связывая ваш дочерний компонент с родительским компонентом, поскольку экземпляры Vue внедряют систему событий (таким образом, выставляя методы $ emit, $ on).
Thank вы так много. Думаю, я пропустил документы «хаба». Знаете ли вы, что заставляет задуматься о создании экземпляра vue только для связи между компонентами? –
См. Мое редактирование выше. Я все еще изучаю vue, поэтому кто-то может объяснить это лучше. – georaldc