Wenn Sie so etwas wie das tun wollen Sie könnten nur die Ereignis-Listener manuell anwenden, indem Sie ein ref
auf dem Hinzufügen von element
Sie wollen das Ereignis gelten, dann, dass der Ereignis-Listener im mounted
Haken zu binden, zu verwenden, wenn die Bedingung erfüllt ist:
Markup
<button ref="button">
Mouse Over Me
</button>
Vue Instanz
new Vue({
el: '#app',
mounted() {
let hasMouse = true;
// If the user has a mouse, add the event listeners
if (hasMouse) {
let button = this.$refs.button
button.addEventListener('mouseover', e => {
this.mouseover = true
})
button.addEventListener('mouseout', e => {
this.mouseover = false
})
}
},
data: {
mouseover: false
}
})
Hier ist eine JSFiddle dafür: https://jsfiddle.net/0fderek6/
Wenn Sie nicht wie dieser Ansatz, können Sie auch eine directive
und legen Sie die bedingte dort nutzen könnten, könnten Sie dann legen Sie das in eine mixin
, um es wiederverwendbar zu machen:
Mixin
const mouseEvents = {
directives: {
mouseEvents: {
bind(el, binding, vnode) {
let hasMouse = true;
if (hasMouse) {
el.addEventListener('mouseover', e => {
vnode.context.mouseover = true
})
el.addEventListener('mouseout', e => {
vnode.context.mouseover = false
})
}
}
}
},
data: {
mouseover: false
}
}
Vue Instanz
new Vue({
el: '#app',
mixins: [mouseEvents]
})
Markup
<button v-mouse-events>
Mouse Over Me
</button>
Hier ist die JSFiddle dafür: https://jsfiddle.net/nq6x5qeq/
EDIT
Wenn Sie den directive
Ansatz mögen, alles, was Sie tun müssen, ist ein unbind
Haken fügen Sie den Hörer zu entfernen, können Sie dann die binding arg
der Ereignistyp sein und die binding value
der Handler:
Vue.directive('mouse', {
bind(el, binding) {
if (hasMouse) {
console.log(binding.arg + ' added')
// bind the event listener to the element
el.addEventListener(binding.arg, binding.value)
}
},
unbind(el, binding) {
if (hasMouse) {
console.log(binding.arg + ' removed')
el.removeEventListener(binding.arg, binding.value)
}
}
});
alles was Sie jetzt tun müssen, ist, jeden Hörer hinzufügen genau wie würden Sie mit v-bind
:
<div v-mouse:mouseover="mouseOverFunction"></div>
Hier ist die JSFiddle Ihnen zu zeigen, wie das funktioniert: https://jsfiddle.net/59ym6hdb/
Sie 'v-wenn hasMouse' und einen Zweig mit den Ereignissen haben und die andere ohne benutzen können. Verwenden Sie wahrscheinlich [Bereichs-Slots] (https://vuejs.org/v2/guide/components.html#Scoped-Slots), um den gemeinsamen Code einzufügen. –
Das ist OK für sehr einfache Komponenten, aber wenn Ihre Vorlage substanziell ist (ich arbeite in diesem Fall mit einem komplexen SVG) wird es ein Schmerz – asi
Die berechnete Eigenschaft scheint eine gute Antwort zu sein. Gibt es einen Grund, warum du es nicht eintippen und als akzeptierte Antwort markieren möchtest? –