Dans mon application vuejs, j'utilise le composant dynamique de la manière suivante:
<mycomponent>
<component ref="compRef" :is="myComponent" v-bind="myComponentProps"></component>
<div class="my-buttons">
<my-button label="Reset" @click="reset()"/>
</div>
</mycomponent >
myComponent
est un accessoire du composant parent qui contient le composant réel à injecter. myComponentProps
sont également prop qui contient les porps pour l'instance injectée.
Je voudrais savoir comment puis-je également lier dynamiquement des écouteurs au composant - j'ai compris que je ne peux pas envoyer un objet à v-on avec plusieurs événements.
Je pensais l'ajouter par programme mais je n'ai trouvé aucune information sur la façon dont cela peut être fait pour Vue événements personnalisés (genre pour addEventListener
équivalent pour les événements personnalisés)
Tout conseil serait très apprécié!
Avec Vue 2.2+, vous pouvez ajouter par programme un écouteur d'événements avec $on(eventName, callback)
:
new Vue({
el: '#app',
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
}
// You can also bind multiple events to one callback
this.$on(['click', 'keyup'], e => { console.log('event', e) })
}
})
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script>
<div id="app">
<div>
<!-- v-on:EVENTNAME adds a listener for the event -->
<button v-on:click="$emit('my-event1')">Raise event1</button>
<button v-on:click="$emit('my-event2')">Raise event2</button>
<button v-on:click="$emit('my-event3')">Raise event3</button>
</div>
<div>
<!-- v-on shorthand: @EVENTNAME -->
<button @click="$emit('my-event1')">Raise event1</button>
<button @click="$emit('my-event2')">Raise event2</button>
<button @click="$emit('my-event3')">Raise event3</button>
</div>
</div>
Avec Vue 2.6+, vous pouvez ajouter dynamiquement un écouteur d'événements dans le modèle:
new Vue({
el: '#app',
data: {
eventname: 'click',
},
methods: {
handler(e) {
console.log('click', e.target.innerText)
}
}
})
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script>
<div id="app">
<button @[eventname]="handler">Raise dynamic event</button>
<!-- Set dynamic key to null to remove event listener -->
<button @click="eventname = null">Unbind event</button>
</div>
Vous pouvez également lier de manière déclarative plusieurs écouteurs d'événements avec v-on="{event1: callback, event2: callback, ...}"
:
new Vue({
el: '#app',
methods: {
onClick() { console.log('click') },
onKeyUp(e) { console.log('keyup', e.keyCode) }
}
})
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script>
<div id="app">
<input type="text" placeholder="type here" v-on="{click: onClick, keyup: onKeyUp}">
</div>