处理Vue.js中的Enter键

use*_*554 50 javascript vue.js

我正在学习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';
    }
});
Run Code Online (Sandbox Code Playgroud)

在我的例子中,如果没有提交表单,我似乎无法按"Enter"键.然而,我希望这个validateEmailAddress功能至少先开火,这样才能捕获它.但是,这似乎并没有发生.我究竟做错了什么?

fit*_*rec 52

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

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

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

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

<div id="app">
  <input v-on:keyup.enter="onEnter" />
  <h1>{{ msg }}</h1>
</div>
Run Code Online (Sandbox Code Playgroud)

祝好运

  • 这给了我我需要的提示。使用 Buefy,我需要为 b-input 添加原生: `v-on:keyup.native.enter="onEnter"` (9认同)
  • 您还可以使用@keyup.enter =“doSomething” (6认同)

Amr*_*pal 33

事件修饰符

您可以在vuejs中引用事件修饰符以防止在enter键上提交表单.

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

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

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

<form v-on:submit.prevent="<method>">
  ...
</form>
Run Code Online (Sandbox Code Playgroud)

正如文档所述,这是语法糖,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 ?
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
html, body, #editor {
  margin: 0;
  height: 100%;
  color: #333;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


Hap*_*wan 21

你在最后一行之前忘了'}'(关闭"方法{...").

此代码有效:

Vue.config.keyCodes.atsign = 50;

new Vue({
  el: '#myApp',
  data: {
    emailAddress: '',
    log: ''
  },
  methods: {
  
    onEnterClick: function() {
    	alert('Enter was pressed');
    },
    
    onAtSignClick: function() {
    	alert('@ was pressed');
    },
    
    postEmailAddress: function() {
			this.log += '\n\nPosting';
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
html, body, #editor {
  margin: 0;
  height: 100%;
  color: #333;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://vuejs.org/js/vue.min.js"></script>

<div id="myApp" style="padding:2rem; background-color:#fff;">

  <input type="text" v-model="emailAddress" v-on:keyup.enter="onEnterClick" v-on:keyup.atsign="onAtSignClick" />
  
  <button type="button" v-on:click="postEmailAddress" >Subscribe</button> 
  <br /><br />
  
  <textarea v-model="log" rows="4"></textarea>
</div>
Run Code Online (Sandbox Code Playgroud)


Rah*_* TP 19

对于输入事件处理,您可以使用

  1. @keyup.enter 或者
  2. @keyup.13

13是回车的键码。对于@key 事件,keycode 是 50。所以你可以使用@keyup.50.

例如:

<input @keyup.50="atPress()" />
Run Code Online (Sandbox Code Playgroud)


agm*_*984 17

您还可以使用如下方式将事件传递到子组件中:

<CustomComponent
    @keyup.enter="handleKeyUp"
/>
Run Code Online (Sandbox Code Playgroud)

...

<template>
    <div>
        <input
            type="text"
            v-on="$listeners"
        >
    </div>
</template>

<script>
export default {
    name: 'CustomComponent',

    mounted() {
        console.log('listeners', this.$listeners)
    },
}
</script>
Run Code Online (Sandbox Code Playgroud)

如果您有一个传递组件并希望侦听器转到特定元素,那么这种方法很有效。


Nun*_*iro 9

此事件对我有用:

@keyup.enter.native="onEnter".
Run Code Online (Sandbox Code Playgroud)


Kit*_*Kit 5

视图3

\n

在 Vue 3 中,如果您想监听输入中的事件输入,则此代码有效:

\n
<input @keyup.enter="onPressEnter" />\n
Run Code Online (Sandbox Code Playgroud)\n

或者,您可能希望事件在按下按键时触发,而不是在释放\xe2\x80\x99s 时触发:

\n
<input @keydown.enter="onPressEnter" />\n
Run Code Online (Sandbox Code Playgroud)\n