我知道有4种 Select
- 像你一样重新emits 事件
- 在子组件上使用
this.$parent
(重复)来访问所需的父组件并发出事件.(请参阅下面的"实现自己的冒泡事件插件")
- 使用一个事件总线,该总线由父级执行
provide
d,子级执行inject
D.
- 使用Vuex存储并将事件推送到子组件中的事件队列.在应用程序的其他地方,观察react 性事件队列中的新元素,或者只是将其绑定到某个东西上.
Implement your own bubbling event plugin
这很简单.该插件添加了一个新的$bubble
方法,可以向父母发送气泡事件.我考虑过发布一个插件来实现这一点,但它太简单了,开销不值得.
// Add this as a Vue plugin
Vue.use((Vue) => {
Vue.prototype.$bubble = function $bubble(eventName, ...args) {
// Emit the event on all parent components
let component = this;
do {
component.$emit(eventName, ...args);
component = component.$parent;
} while (component);
};
});
// Some nested components as an example
// note usage of "$bubble" instead of "$emit"
Vue.component('component-c', {
template: `
<button type="button" @click="$bubble('my-event', 'payload')">
Emit bubbling event
</button>`,
});
Vue.component('component-b', {
template: `<component-c @my-event="onMyEvent" />`,
methods: {
onMyEvent(...args) {
console.log('component-b listener: ', ...args);
},
},
});
Vue.component('component-a', {
template: `<component-b @my-event="onMyEvent" />`,
methods: {
onMyEvent(...args) {
console.log('component-a listener: ', ...args);
},
},
});
var vapp = new Vue({
el: '#app',
methods: {
onMyEvent(...args) {
console.log('root listener: ', ...args);
},
},
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<component-a @my-event="onMyEvent" />
</div>
Event bus
事件总线如下所示:
Vue.component('dyn-menu', {
components: {
'menu-item': {
template: '<li @click="itemClick">{{item.text}}</li>',
props: ['item'],
inject: ['eventBus'], // <-- Inject in the child
methods: {
itemClick() {
// Emit the event on the event bus
this.eventBus.$emit('dyn-menu-item-click', ['menu-item dyn-menu-item-click']);
}
}
}
},
// ...
});
var vapp = new Vue({
el: '#app',
data: {
// ...
eventBus: new Vue(),
},
provide() {
return {
// The parent component provides the event bus to its children
eventBus: this.eventBus,
};
},
created() {
// Listen to events on the event bus
this.eventBus.$on('dyn-menu-item-click', this.menuClick);
},
methods: {
menuClick(message) {}
}
})
工作示例:https://jsfiddle.net/7vwfx52b/
这里列出了很多事件总线插件:https://github.com/vuejs/awesome-vue#custom-events个