Je viens de commencer à utiliser Vue.js et je me tourne continuellement vers jQuery pour aider dans certaines situations. Plus récemment, j'ai tenté de "déclencher" (ou d'émuler) sans succès un événement, tel qu'un événement au clic ou flou.
Je sais que dans jQuery, vous pouvez effectuer les tâches suivantes:
$('#my-selector').trigger('click');
Mais comment cela peut-il être réalisé avec Vue.js? Je souhaite m'éloigner autant que possible de jQuery.
Prenons l'exemple ci-dessous:
<div id="my-scope">
<button type="button" v-on="click: myClickEvent">Click Me!</button>
</div>
<script>
new Vue({
el: "#my-scope",
data: {
foo: "Hello World"
},
methods: {
myClickEvent: function(e) {
console.log(e.targetVM);
alert(this.foo);
},
anotherRandomFunciton: function() {
this.myClickEvent();
}
}
});
</script>
Si je devais appeler anotherRandomFunciton , je voudrais qu'il émule (ou déclenche) l'événement de clic ci-dessus. Cependant, j'essaye que l'événement (ou e dans l'exemple ci-dessus) ne soit jamais transmis à la fonction.
Vue.js a-t-il une méthode pour y parvenir?
Vous devez obtenir une référence à votre bouton en utilisant v-el
ainsi:
<button type="button" @click="myClickEvent" v-el:my-btn>Click Me!</button>
Ensuite, dans votre méthode:
function anotherRandomFunction() {
var elem = this.$els.myBtn
elem.click()
}
C'est juste un événement de clic natif dans le DOM. Voir v-el
Documentation
Ou depuis Vue 2.x:
<template>
<button type="button" @click="myClickEvent" ref="myBtn">
Click Me!
</button>
</template>
<script>
export default {
methods: {
myClickEvent($event) {
const elem = this.$refs.myBtn
elem.click()
}
}
}
</script>
Depuis Vue utilise et écoute uniquement les événements DOM natifs. Vous pouvez déclencher des événements DOM natifs à l'aide de Element#dispatchEvent
comme si:
var elem = this.$els.myBtn; // Element to fire on
var prevented = elem.dispatchEvent(new Event("change")); // Fire event
if (prevented) {} // A handler used event.preventDefault();
Ce n'est pas exactement idéal ou la meilleure pratique. Idéalement, vous devriez avoir une fonction qui gère les éléments internes et un gestionnaire d’événements qui appelle cette fonction. De cette façon, vous pouvez appeler les internes chaque fois que vous en avez besoin.
Si quelqu'un tombe sur cela, voici comment je l'ai fait:
Lors de l'utilisation de this.$refs.myBtn.click()
Je reçois
“TypeError non capturé: ceci. $ Refs.myBtn.click n'est pas une fonction”
Changé en: this.$refs.myBtn.$el.click()
Pour être clair: "$el
”doit être ajouté pour que cela fonctionne.
Vue est par nature étroitement centré - il est prévu que d’autres paquetages comme jQuery (EDIT: pour les fonctionnalités jQuery autre que la manipulation DOM) soient utilisés avec ce logiciel. Je pense que l’utilisation de trigger
de jQuery convient parfaitement.
Cependant, si vous voulez créer vos propres événements sans jQuery, consultez dispatchEvent
:
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent
Ou, dans le cas particulier du clic, il existe une méthode sur les éléments DOM que vous pouvez utiliser:
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click