1。使用事件修饰符
如果您依赖events,您可以尝试与event modifiers 绑定,然后将它们串联起来。比如:
<a @click.stop="doThis" @click.right="showContextMenu"></a>
2。以编程方式附加事件
或者,您可以创建事件列表及其各自的实现以附加并使用v-on 进行循环,这是this post 的一种解决方法:
created() {
const EVENTS = [
{name: 'my-event1', callback: () => console.log('event1')},
{name: 'my-event2', callback: () => console.log('event2')},
{name: 'my-event3', callback: () => console.log('event3')}
]
for (let e of EVENTS) {
this.$on(e.name, e.callback); // Add event listeners
}
}
<button @click="$emit('my-event1')">Raise event1</button>
<button @click="$emit('my-event2')">Raise event2</button>
<button @click="$emit('my-event3')">Raise event3</button>
3。 v-on多个值
否则,就像您可以使用v-bind on multiple values 一样,您实际上也可以使用v-on 来处理事件。
<div id="mydDiv" v-on="handlers"></div>
// ...
data() {
const vm = this;
return {
handlers: {
mousedown: vm.divMousedown,
touchstart: vm.divTouchstart
}
}
},
methods: {
divMousedown() {
console.log('event: mousedown');
},
divTouchstart() {
console.log('event: touched');
}
}
如果您需要按事件类型分解处理程序,请尝试检查type while the event is being fired,因此在您的情况下,因为touchstart 似乎也会触发mousedown,也许:
methods: {
onTouched(evt) {
evt.preventDefault();
if (evt.type === 'mousedown') {
// handle mousedown
}
else if (evt.type === 'touchstart') {
// ...
}
}
}
Note:您可能想在touchmove 上调用preventDefault() 而不是touchstart。这样,鼠标事件仍然可以触发,并且链接之类的东西将继续工作。