使用 Vue.js 从文本输入中按回车键时阻止表单提交

Prevent form submitting when pressing enter from a text input, using Vue.js

我在我的应用程序中使用 Vue.js 并在表单中输入文本

<div id="myVueForm">
<form>
   <input type="text" v-on="keyup:addCategory | key 'enter'">

   <!-- more form fields -->
   <button type="submit">Submit Form</button>
</form>
</div>

在我的 Vue 实例中,我有以下内容

new Vue({
    el: '#myVueForm',

    methods: {
        addCategory: function(e)
        {
           if(e) e.preventDefault();
           console.log("Added a new category, thanks!");
        }
    }
});

尽管有 preventDefault() 调用,当用户在输入文本时按下回车键时,表单仍会提交(尽管 addCategory() 方法会触发)。这种行为可以在 this fiddle.

中得到证明

我知道我可以使用 jQuery 来捕获事件并阻止提交,但我想看看在 Vue 中是否可以这样做,因为这似乎很常见。

提交总是在按键按下时触发。所以使用 keydown 而不是 keyup.

<input type="text"  v-on="keydown:addCategory | key 'enter'">

Vue.js 1.0 你可以做到:

<input type="text" @keyup.enter.prevent="addCategory">

为什么不直接禁用表单提交?

<form v-on:submit.prevent><input .../></form>

这是 Vue.js 2.x 的解决方案:

<input type='text' v-on:keydown.enter.prevent='addCategory' />

您可以从 HTML 获取事件并将其发送到 Vue 以防止出现默认情况,如下所示:

HTML

<input type="text" v-on:keydown.13="my_method($event)">

JS

methods: {
    my_method(event){
        // do something
        if (event) event.preventDefault();
        if (event) event.stopPropagation();
    },
},

你可以使用这个:

HTML

<form name="..." @submit.prevent="onSubmitMethod">

JS

methods: {
  onSubmitMethod() {

  }
}

我为此写了一个助手。

export const preventFormSubmitOnEnter = {
  mounted() {
    let cb = event => {
      if (event) event.preventDefault();
    };
    if (this.$el.nodeName.toLowerCase() === "form") {
      this.$el.onsubmit = cb;
    } else {
      const forms = this.$el.getElementsByTagName("form");
      for (let i = 0; i < forms.length; i++) {
        const form = forms[i];
        if (form) form.onsubmit = cb;
      }
    }
  }
};

在你的 vue 组件中包含这个 mixin,它会自动运行。

这是一个示例(我使用的是 ElementUI):

<template>
  <el-form :model="form" :rules="rules" ref="form">
    <el-form-item prop="reference">
      <el-input v-model="form.reference" placeholder="Your Reference"/>
    </el-form-item>
  </el-form>
</template>

<script>
import { preventFormSubmitOnEnter } from "./util";

export default {
  mixins: [preventFormSubmitOnEnter],
  data() {
    return {
      form: {
        reference: ""
      },
      rules: {
        reference: [{ required: true, message: "Reference is required!" }]
      }
    };
  },
  methods: {
    validate() {
      return new Promise((resolve, reject) => {
        this.$refs.form.validate(valid => {
          this.$emit("on-validate", valid, this.form);
          resolve(valid);
        });
      });
    },
    validateField(prop) {
      this.$refs.form.validateField(prop);
    }
  }
};
</script>

您可以使用禁用提交事件:

<form @submit.prevent="">

然后当你需要做一个表单提交时使用这样的东西:

<button type="submit" @click="mySubmitMethod"> Send </button>

我有一个极端情况,输入在弹出窗口中,而弹出窗口仅用于表单的一部分。我想阻止 enter 在弹出窗口打开时提交表单,但并非完全如此。这有效:

<input type="text" @keydown.enter.prevent = "" /> 

对于那些只是想阻止表单在输入时提交,但又不想在输入时触发任何方法的人,您可以简单地执行以下操作:

<input type="text" @keypress.enter.prevent />

或者在自定义组件上包含 native 修饰符:

<custom-input type="text" @keypress.enter.native.prevent />

可读性好且简洁。

这个有效

 <input type="text" class="form-control" v-model="get_user" @keydown.enter.prevent = "">