Директива v-on
принимает либо имя метода, либо встроенный обработчик .Возвращаемое значение встроенного обработчика не используется, и возврат функции не установит новый обработчик события.Ваш встроенный обработчик генерирует функцию с notifyCallback()
и ничего с ней не делает.
Обратите внимание, что встроенный обработчик имеет специальную переменную ($event
), которая содержит данные события из $emit()
.
Небольшая настройка исходного кода может достичь вашей цели, но она кажется неоптимальной для вашего варианта использования, так как она создает ненужный обратный вызов для каждого события:
<my-component
@callback-a="notifyCallback('callback-a')($event)"
@callback-b="notifyCallback('callback-b')($event)"
/>
Vue.component('my-component', {
template: `<div>
<button @click="emitData('callback-a')">Event A</button>
<button @click="emitData('callback-b')">Event B</button>
</div>`,
methods: {
emitData(eventName) {
this.$emit(eventName, {
foo: `${eventName} 1`,
bar: `${eventName} 2`,
})
}
}
});
new Vue({
el: '#app',
methods: {
notifyCallback(callbackKey) {
return function(data) {
console.log(`Callback: ${callbackKey} has data: ${JSON.stringify(data)}`)
}
}
}
})
<script src="https://unpkg.com/vue@2.5.17"></script>
<div id="app">
<my-component
@callback-a="notifyCallback('callback-a')($event)"
@callback-b="notifyCallback('callback-b')($event)"
/>
</div>
Более чистым решением может быть обработка события непосредственно в notifyCallback()
:
<my-component
@callback-a="notifyCallback('callback-a', $event)"
@callback-b="notifyCallback('callback-b', $event)"
/>
methods: {
notifyCallback(callbackKey, data) {
console.log(`Callback: ${callbackKey} has data: ${data}`)
}
}
Vue.component('my-component', {
template: `<div>
<button @click="emitData('callback-a')">Event A</button>
<button @click="emitData('callback-b')">Event B</button>
</div>`,
methods: {
emitData(eventName) {
this.$emit(eventName, {
foo: `${eventName} 1`,
bar: `${eventName} 2`,
})
}
}
});
new Vue({
el: '#app',
methods: {
notifyCallback(callbackKey, data) {
console.log(`Callback: ${callbackKey} has data: ${JSON.stringify(data)}`)
}
}
})
<script src="https://unpkg.com/vue@2.5.17"></script>
<div id="app">
<my-component
@callback-a="notifyCallback('callback-a', $event)"
@callback-b="notifyCallback('callback-b', $event)"
/>
</div>