EventBus в VueJS не работает

Я пытаюсь узнать о eventBus, и я создал 2 компонента для этого Hello.vue и User.vue.

Привет

<template>
  <button @click="emitGlobalClickEvent()">Click me</button>
</template>


<script>
import { eventBus } from '../main'
export default {
  name: 'hello',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  },
  methods: {
    emitGlobalClickEvent () {
      eventBus.$emit('messageSelected', this.msg)
    }
  }
}
</script>

пользователь

import { eventBus } from '../main';

eventBus.$on('messageSelected', msg => {
    console.log(msg);
})

главный

import Vue from 'vue'
import App from './App'
import router from './router'

export const eventBus = new Vue()

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

Когда я нажимаю на кнопку, я ничего не вижу в журнале консоли и не получаю никаких ошибок.

Я сделал что-то не так или мне нужно добавить что-то еще для работы?

1 ответ

Решение

Я видел, что твой код неполон. Вот почему вы ничего не видите, когда нажимаете на кнопку.

Я надеюсь, что мой код поможет вам понять EventBus и где вы допустили ошибки в вашем коде.

Попробуйте этот код: Hello.vue

<template>
  <div>
    <h2>This is Hello component</h2>
    <button 
      @click="emitGlobalClickEvent()">Click me</button>
  </div>
</template>
<script>
import { eventBus } from '../main'
export default {
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  },
  methods: {
    emitGlobalClickEvent () {
      eventBus.$emit('messageSelected', this.msg)
    }
  }
}
</script>

User.vue

<template>
  <div>
    <h2>This is User component</h2>
    <user-one></user-one>
  </div>
</template>
<script>
  import { eventBus } from '../main'
  import UserOne from './UserOne.vue'
  export default {
    created () {
      eventBus.$on('messageSelected', msg => {
        console.log(msg)
      })
    },
    components: {
      UserOne
    }
  }
</script>

UserOne.vue

<template>
  <div>
      <h3>We are in UserOne component</h3>
      <user-two></user-two>
  </div>
</template>
<script>
  import { eventBus } from '../main'
  import UserTwo from './UserTwo.vue'
  export default {
    created () {
      eventBus.$on('messageSelected', msg => {
        console.log('From UserOne message !!!')
      })
    },
    components: {
      'user-two': UserTwo
    }
  }
</script>

UserTwo.vue

<template>
  <div>
    <h4>We are in UserTwo Child component</h4>
  </div>
</template>
<script>
  import { eventBus } from '../main'
  export default {
    created () {
      eventBus.$on('messageSelected', msg => {
        console.log('From UserTwo message!')
      })
    }
  }
</script>

Я создал другое сообщение в консоли, чтобы увидеть разницу для всех компонентов, но если вы введете msg во все $on, в консоли вы получите то же сообщение.

Другие вопросы по тегам