处理 Vue 中的输入密钥.js

2022-08-30 02:43:44

我正在学习Vue.js。在我的Vue中,我有一个文本字段和一个按钮。默认情况下,当有人按键盘上的 Enter 键时,此按钮会提交表单。当有人在文本字段中键入内容时,我想捕获按下的每个键。如果键是“@”符号,我想做一些特别的事情。如果按下的键是“Enter”键,我也想做一些特别的事情。后者是给我挑战的那个。目前,我有这个小提琴,它包括以下代码:

new Vue({
  el: '#myApp',
  data: {
    emailAddress: '',
    log: ''
  },
  methods: {
    validateEmailAddress: function(e) {
      if (e.keyCode === 13) {
        alert('Enter was pressed');
      } else if (e.keyCode === 50) {
        alert('@ was pressed');
      }      
      this.log += e.key;
    },

    postEmailAddress: function() {
      this.log += '\n\nPosting';
    }
});

在我的例子中,我似乎无法在不提交表单的情况下按“Enter”键。然而,我希望这个函数至少首先触发,这样我就可以捕获它。但是,这似乎并没有发生。我做错了什么?validateEmailAddress


答案 1

在 vue 2 中,你可以通过查看文档来捕获 enter 事件:v-on:keyup.enter

https://v2.vuejs.org/v2/guide/events.html#Key-Modifiers

我留下一个非常简单的例子:

var vm = new Vue({
  el: '#app',
  data: {msg: ''},
  methods: {
    onEnter: function() {
       this.msg = 'on enter event';
    }
  }
});
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>

<div id="app">
  <input v-on:keyup.enter="onEnter" />
  <h1>{{ msg }}</h1>
</div>

祝你好运


答案 2

事件修饰符

您可以在 vuejs 中引用事件修饰符,以防止在密钥上提交表单。enter

调用事件处理程序或在事件处理程序内部是非常普遍的需求。event.preventDefault()event.stopPropagation()

虽然我们可以在方法中轻松做到这一点,但如果这些方法可以纯粹是关于数据逻辑而不是必须处理DOM事件细节,那就更好了。

为了解决这个问题,Vue 为 提供了事件修饰符。回想一下,修饰符是指令后缀,用点表示。v-on

<form v-on:submit.prevent="<method>">
  ...
</form>

正如文档所述,这是语法糖,并且将在按Enter键时停止不需要的表单提交。e.preventDefault()

这是一个工作小提琴。

new Vue({
  el: '#myApp',
  data: {
    emailAddress: '',
    log: ''
  },
  methods: {
    validateEmailAddress: function(e) {
      if (e.keyCode === 13) {
        alert('Enter was pressed');
      } else if (e.keyCode === 50) {
        alert('@ was pressed');
      }      
      this.log += e.key;
    },
    
    postEmailAddress: function() {
            this.log += '\n\nPosting';
    },
    noop () {
      // do nothing ?
    }
  }
})
html, body, #editor {
  margin: 0;
  height: 100%;
  color: #333;
}
<script src="https://unpkg.com/vue@2.2.4/dist/vue.js"></script>
<div id="myApp" style="padding:2rem; background-color:#fff;">
<form v-on:submit.prevent="noop">
  <input type="text" v-model="emailAddress" v-on:keyup="validateEmailAddress" />
  <button type="button" v-on:click="postEmailAddress" >Subscribe</button> 
  <br /><br />
  
  <textarea v-model="log" rows="4"></textarea>  
</form>
</div>