如何跨多个子 Vue 组件捕获事件

rho*_*ard 2 vue.js

我正在 vue.js 中构建表单框架。我有每个字段类型的组件。每个字段类型组件都使用 this.$emit 与父组件通信更改。

我能够使用 v-on 指令在父组件中触发事件,如下所示:

<template>
<div v-if="fieldsLoaded">
    <form-select :field="fields.title" v-on:updated="validate" ></form-select>
    <form-input :field="fields.first_name" v-on:updated="validate" ></form-input>
</div>
</template>
Run Code Online (Sandbox Code Playgroud)

但是,我不想手动指定每个组件都应该validate单独触发该方法。

如何让父组件监听updated其所有子组件的发射?

编辑:我正在寻找类似下面的东西,虽然 $on 只捕获发生在同一组件中的发射,而不是它的子组件

created: function(){
    this.$on('updated',validate)
}
Run Code Online (Sandbox Code Playgroud)

rol*_*oli 5

event bus在我看来,最好的方法是使用甚至更好vuex

对于第一种情况,请看这里

对于这里的第二个

有了event bus你可以发出一个事件,并听取只要你想要的事件(在父母,子女,甚至在同一组件)

VuexIt serves as a centralized store for all the components in an application并且你可以在那个 store 中拥有属性,并且你可以使用和操作它们。

事件总线示例:

主要.js:

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

export const eventBus = new Vue();

new Vue({
  el: '#app',
  render: h => h(App)
})
Run Code Online (Sandbox Code Playgroud)

用户组件

<template>
  <button @click="clicked">Click me to create event</button>
</template>
<script>
    import { eventBus } from './main'
    export default {
    name: 'User',
    methods: {
        clicked() {
        eventBus.$emit('customEvent', 'a text to pass')
      }
    }
  }
</script>
Run Code Online (Sandbox Code Playgroud)

管理组件

<template>
 <p>The message from event is: {{message}}</p>
</template>
<script>
    import { eventBus } from './main'
    export default {
    name: 'Admin',
    data: () => ({
        message: ''
    })
    created() {
        eventBus.$on('customEvent', dataPassed => {
        this.message = dataPassed
      }
    }
  }
</script>
Run Code Online (Sandbox Code Playgroud)

看看这个教程来学习Vuex