$ emit не вызывает дочерние события

Для проекта VueJS 2.0 у родительского компонента

есть следующее:
<template>
<child></child>
<button @click="$emit('childEvent)"></button>
</template>

на дочернем компоненте я:

{
  events: { 'childEvent' : function(){.... },
  ready() { this.$on('childEvent',...) },
  methods: { childEvent() {....} }
}

Ничего не работает при нажатии кнопки. Нужно ли мне создавать родительский метод, который затем выдавал бы ребенку? Я использовал vuejs 1. но теперь я смущен относительно способов работы с родителями для детей

Ответ 1

В то время как другие ответы правильные, и обычно можно использовать подход, основанный на данных.

Я собираюсь добавить это для тех, кто ищет ответ на этот вопрос, которому нужен способ, отличный от реквизита. Я столкнулся с аналогичной проблемой при попытке установить фокус на конкретном входе внутри настраиваемого компонента формы. Чтобы сделать это, я должен был предоставить пользовательский компонент ref, затем сделать это.

this.$refs.customInput.$emit('focus');
//or
this.$refs.customInput.directlyCallMethod();

Это обращение к экземпляру vue дочернего элемента, а затем вы можете испустить событие, которое будет слышно этим компонентом.

Ответ 2

Как par документация:

В Vue.js отношение родительский и дочерний компонент можно суммировать как реквизиты вниз, события вверх. Родитель передает данные вниз ребенку через реквизит, а потом отправляет сообщения родителям через события. Давайте посмотрим, как они будут работать дальше.

введите описание изображения здесь

Итак, в последнем Vue вы не можете отправлять события от родителя к дочернему, вы можете передавать реквизиты для дочернего элемента и отправлять событие от дочернего к родительскому.

Ответ 3

Для этого вы можете использовать пользовательский экземпляр Vue.

// Globally
const eventBus = new Vue()

// In your child
eventBus.$on('eventName', () => {
    // Do something
});

// In your parent
eventBus.$emit('eventName')

Ответ 4

События от родителя к дочернему выполняются с помощью $broadcast() в Vue 1.0 и вообще не возможны в Vue 2.0.

И вам, возможно, это не нужно, обычно это лучшее решение, не требующее событий, но это зависит от вашего использования.

Ответ 5

Мне нужно было сделать это для поповера, где могло бы существовать несколько, а реквизиты для каждого неуместны.

Для отправки глобальных событий можно добавить прослушиватели событий в экземпляр $ root Vue.

// Child:
    created() {
      this.$root.$on('popover', (e) => {
        // Determine if popover should close, etc.
        this.close()
      })
    },
    
// Parent: 
  this.$emit('popover', 'arg1', 'argn')