Ответ 1
Представление всегда запускается при нажатии клавиши. Поэтому используйте keydown вместо keyup.
<input type="text" v-on="keydown:addCategory | key 'enter'">
Я использую 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()
срабатывает). Это поведение можно продемонстрировать в этой скрипке.
Я знаю, что могу использовать jQuery, чтобы поймать событие и предотвратить отправку, но я хотел бы посмотреть, возможно ли это в Vue сделать это, поскольку это кажется довольно распространенным использованием.
Представление всегда запускается при нажатии клавиши. Поэтому используйте keydown вместо keyup.
<input type="text" v-on="keydown:addCategory | key 'enter'">
Здесь решение для Vue.js 2.x:
<input type='text' v-on:keydown.enter.prevent='addCategory' />
почему не просто отключить отправку формы?
<form v-on:submit.prevent><input .../></form>
Vue.js 1.0 вы можете сделать:
<input type="text" @keyup.enter.prevent="addCategory">
Вы можете использовать это:
HTML
<form name="..." @submit.prevent="onSubmitMethod">
JS
methods: {
onSubmitMethod() {
}
}
Вы можете получить событие из 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();
},
},
я написал помощник для этого.
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, и он будет работать автоматически.
Вот пример (я использую 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>