J'ai un composant Vue avec
<input>
qui lie la clé v-on:keyup.enter
à doFilter()
<button>
qui lie l'événement v-on:click
à doFilter()
<input type="text" v-model="myVar" @keyup.enter="doFilter" />
<button @click="doFilter">Filter</button>
L'événement bouton déclenchera doFilter()
, mais l'événement de touche active ne se déclenchera pas, sauf si j'ajoute le modificateur .native
.
<input type="text" v-model="myVar" @keyup.native.enter="doFilter" />
La documentation de Vue.js dit ceci à propos de.native
:
écouter pour un événement natif sur l'élément racine du composant.
Quand dois-je utiliser .native
et pourquoi l'événement keyup ne se déclenche-t-il pas?
Démo exécutable sur https://codepen.io/hanxue/pen/Zapmra
<div id="app">
<md-toolbar>
<h1 class="md-title" style="flex: 1">@keyup.native event</h1>
<md-button class="md-icon-button">
<md-icon>more_vert</md-icon>
</md-button>
</md-toolbar>
<md-input-container>
<label>@keyup.enter</label>
<md-input type="text" @keyup.enter="doFilter" placeholder="@keyup.filter">
</md-input>
</md-input-container>
<md-input-container>
<label>@keyup.native.enter</label>
<md-input type="text" @keyup.native.enter="doFilter" placeholder="@keyup.native.filter">
</md-input>
</md-input-container>
<md-input-container>
<button @click="doFilter" placeholder="@keyup.filter">
@click </button>
</md-input-container>
</div>
<script>
Vue.use(VueMaterial)
var App = new Vue({
el: '#app',
methods: {
doFilter: function() {
alert('doFilter!')
}
},
})
</script>
Sur la base de vos commentaires, je suppose que vous utilisez le composant Vue Material libary et le composant <md-input>
à la place d'un élément <input>
.
Si vous écoutez l'événement keyup
sans utiliser le modificateur .native
(via <md-input @keyup.enter="doFilter">
), votre composant attend que le composant <md-input>
émette un événement personnalisé keyup
.
Cependant, ce composant n'émet pas d'événement keyup
, la méthode doFilter
ne sera jamais appelée.
Comme indiqué dans la documentation , l'ajout du modificateur .native
fait en sorte que le composant écoute un "événement natif sur l'élément racine" du composant <md-input>
.
Ainsi, <md-input @keyup.native.enter="doFilter>
écoutera l'événement DOM natif keyup
de l'élément racine du composant <md-input>
et appellera la méthode doFilter
lorsque cet événement est déclenché à partir de l'élément racine. Enter clé.
J'ai eu le même problème sur un composant d'affichage personnalisé sur lequel j'écoutais à la fois @select
et @keyup.native.enter
et que je recevais le message Enter touche deux fois parce que je ne faisais pas attention: onSelect
émet un onKeyDown
pour Enteret onkeyUp
s'est allumé en second lieu.
Ma solution a consisté à écouter @keydown.native.enter
afin que le cycle de clés @select
ne soit plus gêné (ce qui est keydown
-> keypresssed
-> keyup
).