【问题标题】:Handling Enter Key in Vue.js处理 Vue.js 中的 Enter 键
【发布时间】:2017-08-14 14:04:00
【问题描述】:

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

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 函数至少首先触发,以便我可以捕获它。但是,这似乎并没有发生。我做错了什么?

【问题讨论】:

  • 我在你的小提琴中看不到任何形式?

标签: javascript vue.js


【解决方案1】:

事件修饰符

可以在vuejs中引用event modifiers,防止在enter键上提交表单。

在事件处理程序中调用event.preventDefault()event.stopPropagation() 是很常见的。

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

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

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

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

Here 是一个工作小提琴。

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>

【讨论】:

  • 我必须将其修改为 `@keyup.native="validateEmailAddress" 才能与我在 vue-cli 3 中的设置一起使用
【解决方案2】:

您在最后一行之前忘记了一个“}”(以关闭“方法 {...”)。

此代码有效:

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';
    }
  }
})
html, body, #editor {
  margin: 0;
  height: 100%;
  color: #333;
}
<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>

【讨论】:

  • 有没有列出字符和数字(如50和@)映射关系的网站?我在 Vue 文档中找不到它
【解决方案3】:

在 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';
    }
  }
});
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

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

祝你好运

【讨论】:

  • 这给了我需要的提示。使用 Buefy,我需要为 b 输入添加原生:v-on:keyup.native.enter="onEnter"
  • 你也可以使用@keyup.enter="doSomething"
  • v-on:keyup.native.enter="onEnter" 仅对不在按钮上的组件有效。
  • 我们是否总是需要输入来检测按键?我正在尝试使用箭头和 esc 键(全屏时)控制 Buefy 轮播。
  • buefy 输入和 chrome 我需要 @keydown.enter.native="doSomething" github.com/bootstrap-vue/bootstrap-vue/issues/…
【解决方案4】:

这个活动对我有用:

@keyup.enter.native="onEnter".

【讨论】:

    【解决方案5】:

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

    1. @keyup.enter
    2. @keyup.13

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

    例如:

    <input @keyup.50="atPress()" />
    

    【讨论】:

    • 有没有列出字符和数字(如50和@)映射关系的网站?我在 Vue 文档中找不到它。
    • 我可以使用多个键吗? @keydown.1.2 之类的东西?
    • 是的,
    【解决方案6】:

    您还可以通过以下方式将事件传递给子组件:

    <CustomComponent
        @keyup.enter="handleKeyUp"
    />
    

    ...

    <template>
        <div>
            <input
                type="text"
                v-on="$listeners"
            >
        </div>
    </template>
    
    <script>
    export default {
        name: 'CustomComponent',
    
        mounted() {
            console.log('listeners', this.$listeners)
        },
    }
    </script>
    

    如果您有一个直通组件并希望侦听器进入特定元素,则效果很好。

    【讨论】:

      【解决方案7】:

      您缺少方法的右大括号

      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';
          }
        }//add this closing bracket and everything is fine
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2018-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多